แตะทุกโฟลเดอร์ในไดเรกทอรี


14

ฉันพยายามอัปเดตการประทับเวลาของโฟลเดอร์ทั้งหมดใน cwd โดยใช้สิ่งนี้:

for file in `ls`; do touch $file; done

แต่ดูเหมือนจะไม่ทำงาน ความคิดใด ๆ

คำตอบ:


21

คำตอบทั้งหมดจนถึงตอนนี้ (รวมถึงตัวอย่างในคำถาม) ถือว่าคุณต้องการtouchทุกสิ่งในไดเรกทอรีแม้ว่าคุณจะพูดว่า "แตะโฟลเดอร์ทั้งหมด" หากปรากฏว่าไดเรกทอรีมีไฟล์และโฟลเดอร์และคุณต้องการอัปเดตโฟลเดอร์คุณสามารถใช้find:

$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +

หรือหากfindการใช้งานของคุณไม่รองรับมาตรฐาน-mindepth/ ภาค-maxdepthแสดง:

$ find . ! -name . -prune -type d -exec touch {} +

นี้:

$ touch -c -- */

ควรทำงานในเชลล์ส่วนใหญ่ยกเว้นว่า:

  • มันจะtouch symlink ไปยังไดเรกทอรีนอกเหนือจากไดเรกทอรีธรรมดา
  • มันจะละเว้นสิ่งที่ซ่อนอยู่
  • ถ้าไม่มีไดเรกทอรีหรือ symlink ไปไดเรกทอรีก็จะสร้างไฟล์ที่เรียกว่า*ในเปลือกหอยอื่น ๆ กว่าcsh, tcsh, zsh, fishหรือเปลือก ธ อมป์สัน (ซึ่งจะรายงานข้อผิดพลาดแทน) นี่เรากำลังใช้-cในการทำงานรอบ ๆ มัน แต่ที่ยังคงเป็นไฟล์ที่ไม่ใช่ไดเรกทอรีที่เรียกว่าtouch*

ด้วยzshไปยังtouchไดเรกทอรีเท่านั้นรวมถึงที่ซ่อนอยู่:

touch -- *(D/)

'{} \ +' เกี่ยวกับอะไร
javamonkey79

3
{} \+เป็นพิเศษfindไวยากรณ์ - อ่านหน้าคนสำหรับข้อมูลเพิ่มเติม ฉันคิดว่าtouch -c ./*/จะทำงานได้ดี
jw013

2
คุณควรรวม-maxdepth 1ถึงคำสั่งเพื่อที่findจะไม่ได้รับการชดเชยในโฟลเดอร์ย่อย OP ดูเหมือนว่าต้องการสัมผัสเฉพาะโฟลเดอร์เหล่านั้นใน cwd ไม่ใช่โฟลเดอร์ย่อย
Steven Monday

1
@ jw013 มัน - คุณยังคงยึดความคิดที่ดีกับคำตอบของคนอื่น :)
Michael Mrozek

ทำไมคุณต้องหลบหนีตัวละคร + มีเปลือกหอยที่ตีความมันได้หรือไม่
Witiko

11

ลอง

touch ./*

มันหลีกเลี่ยงการforวนซ้ำที่ไม่จำเป็นซึ่งจะวางไข่กระบวนการใหม่สำหรับทุกไฟล์เดียวและใช้งานได้กับชื่อไฟล์ทั้งหมดแม้แต่คนที่มีช่องว่างหรือคนที่มีลักษณะเหมือนตัวเลือก (เช่น-t) เวลาเท่านั้นที่มันจะไม่ทำงานคือถ้าคุณมีไม่มี (Non-dot) *ไฟล์ในไดเรกทอรีในกรณีที่คุณจะจบลงด้วยการสร้างไฟล์ชื่อ เพื่อหลีกเลี่ยงปัญหานั้นสำหรับกรณีของtouchการใช้งานส่วนใหญ่มี-cตัวเลือก (หรือที่เรียกว่า--no-createในเวอร์ชั่น GNU) เพื่อไม่สร้างไฟล์ที่ไม่มีอยู่เช่น

touch -c ./*

ดูเพิ่มเติมอ้างอิงที่ดีในการตอบ jasonwryan ของเป็นอย่างดีเช่นนี้อย่างใดอย่างหนึ่ง


1
จะเกิดอะไรขึ้นถ้าคุณมี 1 ล้านโฟลเดอร์ใน cwd
Steven Monday

หากคุณพบปัญหาการพิมพ์ "รายการอาร์กิวเมนต์ยาวเกินไป" คุณควรเปลี่ยนไปใช้เครื่องมือ "หนักกว่า" เช่นfind . -type d -maxdepth1 -print0 | xargs -0 touchหรือคำตอบของ MichaelMrozek ด้านบน
jw013

7

คุณไม่ควรพยายามที่จะแยกการส่งออกของls

นอกจากนี้คุณควรพูดของคุณ"$file"เพื่อจับช่องว่างใด ๆ ดูhttp://www.grymoire.com/Unix/Quote.html

บางสิ่งเช่นนี้อาจทำให้คุณเป็นอย่างที่ต้องการ:

for file in *; do touch "$file"; done

ดูสองBash Pitfallsสำหรับคำอธิบายที่ละเอียดยิ่งขึ้น


2
ปิด แต่ไม่มาก touch ./*ควรจะทำงานในกรณีส่วนใหญ่ ไม่จำเป็นต้องมีการforวนซ้ำเนื่องจากtouchสามารถใช้หลายไฟล์ได้และคุณจำเป็นต้อง./จัดการไฟล์ที่มีชื่อ--helpอย่างถูกต้อง นี่เป็นทรัพยากรที่ดีในเรื่อง
jw013

ทำไม '*' ถึงทำงาน
javamonkey79

@ javamonkey79 มันเปลือกglobbing
jw013

1
@ jw013 จุดยอดเยี่ยม: และขอขอบคุณสำหรับลิงค์ล้อ
jasonwryan

โปรดทราบว่า*จะไม่จับไฟล์และไดเรกทอรีที่ชื่อขึ้นต้นด้วยจุด วิธีการหนึ่งในการแก้ไขปัญหาที่มีการเปิดใช้งานตัวเลือกเปลือกผ่านdotglob shopt -s dotglob
Witiko

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.