ฉันพยายามอัปเดตการประทับเวลาของโฟลเดอร์ทั้งหมดใน cwd โดยใช้สิ่งนี้:
for file in `ls`; do touch $file; done
แต่ดูเหมือนจะไม่ทำงาน ความคิดใด ๆ
ฉันพยายามอัปเดตการประทับเวลาของโฟลเดอร์ทั้งหมดใน cwd โดยใช้สิ่งนี้:
for file in `ls`; do touch $file; done
แต่ดูเหมือนจะไม่ทำงาน ความคิดใด ๆ
คำตอบ:
คำตอบทั้งหมดจนถึงตอนนี้ (รวมถึงตัวอย่างในคำถาม) ถือว่าคุณต้องการ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 ไปยังไดเรกทอรีนอกเหนือจากไดเรกทอรีธรรมดา*ในเปลือกหอยอื่น ๆ กว่าcsh, tcsh, zsh, fishหรือเปลือก ธ อมป์สัน (ซึ่งจะรายงานข้อผิดพลาดแทน) นี่เรากำลังใช้-cในการทำงานรอบ ๆ มัน แต่ที่ยังคงเป็นไฟล์ที่ไม่ใช่ไดเรกทอรีที่เรียกว่าtouch*ด้วยzshไปยังtouchไดเรกทอรีเท่านั้นรวมถึงที่ซ่อนอยู่:
touch -- *(D/)
{} \+เป็นพิเศษfindไวยากรณ์ - อ่านหน้าคนสำหรับข้อมูลเพิ่มเติม ฉันคิดว่าtouch -c ./*/จะทำงานได้ดี
-maxdepth 1ถึงคำสั่งเพื่อที่findจะไม่ได้รับการชดเชยในโฟลเดอร์ย่อย OP ดูเหมือนว่าต้องการสัมผัสเฉพาะโฟลเดอร์เหล่านั้นใน cwd ไม่ใช่โฟลเดอร์ย่อย
ลอง
touch ./*
มันหลีกเลี่ยงการforวนซ้ำที่ไม่จำเป็นซึ่งจะวางไข่กระบวนการใหม่สำหรับทุกไฟล์เดียวและใช้งานได้กับชื่อไฟล์ทั้งหมดแม้แต่คนที่มีช่องว่างหรือคนที่มีลักษณะเหมือนตัวเลือก (เช่น-t) เวลาเท่านั้นที่มันจะไม่ทำงานคือถ้าคุณมีไม่มี (Non-dot) *ไฟล์ในไดเรกทอรีในกรณีที่คุณจะจบลงด้วยการสร้างไฟล์ชื่อ เพื่อหลีกเลี่ยงปัญหานั้นสำหรับกรณีของtouchการใช้งานส่วนใหญ่มี-cตัวเลือก (หรือที่เรียกว่า--no-createในเวอร์ชั่น GNU) เพื่อไม่สร้างไฟล์ที่ไม่มีอยู่เช่น
touch -c ./*
ดูเพิ่มเติมอ้างอิงที่ดีในการตอบ jasonwryan ของเป็นอย่างดีเช่นนี้อย่างใดอย่างหนึ่ง
คุณไม่ควรพยายามที่จะแยกการส่งออกของls
นอกจากนี้คุณควรพูดของคุณ"$file"เพื่อจับช่องว่างใด ๆ ดูhttp://www.grymoire.com/Unix/Quote.html
บางสิ่งเช่นนี้อาจทำให้คุณเป็นอย่างที่ต้องการ:
for file in *; do touch "$file"; done
ดูสองBash Pitfallsสำหรับคำอธิบายที่ละเอียดยิ่งขึ้น
*จะไม่จับไฟล์และไดเรกทอรีที่ชื่อขึ้นต้นด้วยจุด วิธีการหนึ่งในการแก้ไขปัญหาที่มีการเปิดใช้งานตัวเลือกเปลือกผ่านdotglob shopt -s dotglob
for file in `find .`; do touch $file; done