ลบไฟล์ในไดเรกทอรีโดยไม่มีข้อผิดพลาดหากไฟล์นั้นว่างเปล่า


31

ในฐานะส่วนหนึ่งของสคริปต์การปรับใช้งานฉันต้องการถ่ายโอนข้อมูลที่แคชไว้บางส่วนจากไดเรกทอรีชั่วคราวของฉัน ฉันใช้คำสั่งเช่น:

rm /tmp/our_cache/*

อย่างไรก็ตามถ้า/tmp/our_cacheว่างเปล่า (เป็นเรื่องธรรมดาเมื่อทำการเปลี่ยนแปลงจำนวนมากอย่างต่อเนื่องไปยังเซิร์ฟเวอร์ทดสอบของเรา) สิ่งนี้จะพิมพ์ข้อความแสดงข้อผิดพลาดต่อไปนี้:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

มันไม่ใช่เรื่องใหญ่ แต่มันน่าเกลียดนิดหน่อยและฉันต้องการลดอัตราส่วนสัญญาณรบกวนต่อสัญญาณในเอาต์พุตจากสคริปต์นี้

มีวิธีรัดกุมในยูนิกซ์เพื่อลบเนื้อหาของไดเรกทอรีโดยไม่ได้รับข้อความบ่นว่าไดเรกทอรีว่างเปล่าอยู่แล้ว?

คำตอบ:


48

เนื่องจากคุณต้องการลบไฟล์ทั้งหมดโดยไม่ต้องแจ้งให้ทราบทำไมไม่ใช้-fสวิตช์rmเพื่อละเว้นไฟล์ที่ไม่มีอยู่

rm -f /tmp/our_cache/*

จากหน้าคน:

-f, --force
          ignore nonexistent files, never prompt

นอกจากนี้หากอาจมีไดเรกทอรีย่อยใด ๆ อยู่/tmp/our_cache/และคุณต้องการลบสิ่งเหล่านั้นและเนื้อหาในไดเรกทอรีด้วยอย่าลืม-rสวิตช์


3
ทางออกที่ชัดเจนที่สุดและฉันไม่ได้คิดเกี่ยวกับมัน! ฉันรู้สึกเหมือนผู้ชายคนแรกในการ์ตูนxkcd.com/399 ;-) นี้
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

แก้ไข 1

นำออกแล้ว "-type f

แก้ไข 2

เพิ่มตัวเลือกที่ไม่ได้มาตรฐาน-mindepth 1เพื่อป้องกันการลบไดเรกทอรีการค้นหา (หลังจากลบ-type fข้อ จำกัด ออกไป)


เพิ่งทราบฉันจะออก-type fเนื่องจากอาจมีไดเรกทอรีชั่วคราวเช่นกัน (แม้ว่าตัวอย่างในคำถามไม่ได้บัญชีสำหรับพวกเขาดังนั้นพวกเขาอาจจะไม่ได้อยู่ที่นั่น ... )
Izkata

1
การใช้-type fจะลบไฟล์ปกติเท่านั้นดังนั้นลิงก์สัญลักษณ์เช่นจะไม่ถูกลบ
Huygens

@rush ขออภัยฉันไม่ได้ตรวจสอบ แต่เพิ่งได้ดูหน้าคนที่บอกว่า "ลบไฟล์" ไม่พูดถึงไดเรกทอรีใด ๆ ฉันลบความคิดเห็นของฉัน
Hauke ​​Laging

1
นั่นเป็นการลบ/tmp/our_cacheดังนั้นคุณอาจทำเช่นrm -r /tmp/our_cacheกัน -mindepth 1ในขณะที่คุณกำลังที่ใช้ตัวเลือกที่ไม่ได้มาตรฐานคุณสามารถใช้ โปรดทราบว่าในทางตรงกันข้ามrm /tmp/our_cache/*มันยังลบไดเรกทอรีย่อยรวมถึงเนื้อหาและไฟล์ที่ซ่อนอยู่ด้วย
Stéphane Chazelas

2

คุณสามารถเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐาน/dev/nullเพื่อที่จะไม่พิมพ์นี้

$  rm /tmp/our_cache/* 2>/dev/null

2
สิ่งนี้จะไม่ระงับข้อผิดพลาดที่แสดงหากพูดว่าไม่สามารถลบไฟล์ได้เนื่องจากมีการใช้งานอยู่หรือไม่ ข้อผิดพลาดเดียวที่ฉันต้องการระงับคือสิ่งที่แสดงถ้าไดเรกทอรีเป้าหมายว่างเปล่า ดูเหมือนว่ามันจะมีผลข้างเคียงที่ไม่พึงประสงค์
Mark Amery

แม้ว่าคุณจะพยายามลบไฟล์บางไฟล์ที่กระบวนการบางอย่างเปิดขึ้นมา แต่คุณจะไม่ได้รับข้อผิดพลาด
pradeepchhetri

1

อีกวิธีหนึ่ง (แม้ว่าจะมากไปหน่อย ... ):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

สิ่งนี้ใช้testหรือ[เพื่อทดสอบว่าสตริงที่ส่งคืนจากการรันlsบนไดเรกทอรีของคุณไม่ว่างเปล่า จากนั้นหากและถ้าหากสตริงนั้นไม่ว่างเปล่าจะเป็นการลบทุกสิ่งภายใต้ไดเรกทอรีของคุณ

หมายเหตุ: การปล่อย glob ออกจากlsจะเป็นการยับยั้งข้อผิดพลาดของไฟล์ไม่ได้


-1

หากสคริปต์ของคุณคือการใช้ BASH คุณสามารถลอง:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

การทำเช่นนั้นจะยังคงเกิดข้อผิดพลาดหากมีปัญหา "ของจริง" หรือหากไฟล์ได้รับการปกป้อง (คุณจะต้องใช้-fตัวแก้ไขrmเพื่อลบไฟล์ประเภทนี้) แต่จะหลีกเลี่ยงข้อผิดพลาดเมื่อไม่มีไฟล์อยู่

หากคุณใช้เชลล์อื่นนอกเหนือจาก BASH สำหรับการเขียนสคริปต์ของคุณเช่น zsh, ksh คุณสามารถลองใช้ไวยากรณ์อื่นที่อาจพกพาได้มากกว่านี้:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.