ฉันพยายามอัปเดตการประทับเวลาของโฟลเดอร์ทั้งหมดใน 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