จะลบไฟล์และไดเรกทอรีที่ซ่อนอยู่ทั้งหมดโดยใช้ Bash ได้อย่างไร


28

ทางออกที่ชัดเจนสร้างรหัสทางออก 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

ทางออกหนึ่งที่เป็นไปได้จะข้าม "." และไดเรกทอรี ".. " แต่จะลบไฟล์ที่มีชื่อยาวเกิน 3 ตัวอักษรเท่านั้น:

bash$ rm -f .??*

ถ้าคุณไม่กังวลเกินไปที่จะไม่สามารถลบออกได้ & .. แล้วใครจะสน? ถ้าคุณไม่กังวลเกี่ยวกับผลลัพธ์ที่น่าเกลียดในสคริปต์ฉันคิดว่าวิธีแก้ปัญหาที่ชัดเจนคือการพิมพ์น้อยกว่าที่คนอื่น ๆ ค่อนข้างตรงไปตรงมา
Matt

เพียงแค่คุณก็รู้ .. และ ไม่ใช่ไฟล์ พวกเขาจะอ้างอิงถึงไดเรกทอรี . (แค่จุดเดียว) คือไดเรกทอรีปัจจุบันและ .. (สองจุด) เป็นลิงก์ไปยังไดเรกทอรีหนึ่งระดับขึ้นไป ตัวอย่างเช่นถ้า cd / home / user เท่ากับ / home / user และ .. is / home / ในคำอื่น ๆ คุณไม่สามารถลบ และ .. (.?)
phuzion

ขอบคุณสำหรับความคิดเห็น Matt ฉันมักจะใช้คำสั่งในสคริปต์ที่มีต่อการตรวจสอบรหัสออกจากคำสั่ง (set -e) ในกรณีเหล่านี้จำเป็นต้องมีรหัสทางออกที่บ่งบอกถึง
Yonatan Broza

ไม่มีสิ่งใดในตัว และ .. ที่ปกป้องพวกเขาจากการลบด้วย rm -rf นี่เป็นเพียงกลไกการป้องกันที่เพิ่มเข้ามาในรูปแบบที่ทันสมัยของ RM
kubanczyk

และมี rm -rf อยู่เสมอ * || เป็นจริงถ้าคุณต้องการหลีกเลี่ยงพฤติกรรม set -e สำหรับคำสั่งนั้น
Domingo Ignacio Galdos

คำตอบ:


34
rm -rf [^.]. ?? *

ควรจับทุกกรณี .? * จะจับคู่ชื่อไฟล์ของตัวละคร 3+ ตัวเท่านั้น (ดังที่อธิบายไว้ในคำตอบก่อนหน้า),. [^.] จะจับคู่ตัวละครสองตัว (นอกเหนือจาก .. )


ขอบคุณสำหรับคำตอบ! ขึ้นอยู่กับว่าฉันได้รับเวอร์ชันสั้นกว่าของ "rm -rf. [^.] *"
Yonatan Broza

4
ระวังด้วยเวอร์ชันที่สั้นกว่านั้นมันจะให้ผลลัพธ์ที่คล้ายกัน มันจะไม่ตรงกับชื่อที่มีสองจุดที่ด้านหน้า (เช่น "... /" ซึ่งจะเห็นบางครั้ง rootkits ที่หลบซ่อนตัว ฯลฯ )
รัสเซล Heilling

และระมัดระวังที่จะทำให้การตรวจสอบ PWD u หรือหลวมการตั้งค่าทั้งหมดของคุณ :)
kommradHomer

ดูเหมือนจะใช้งานzshไม่ได้ ข้อเสนอแนะใด ๆ
ryanjdillon

ด้วยzshค่าเริ่มต้นการจับคู่ไวด์การ์ดที่ว่างจะถือเป็นข้อผิดพลาด ในขณะที่bashมันจะถูกส่งผ่านเพียงไม่เปลี่ยนแปลง เพื่อให้zshทำงานในลักษณะเดียวกันคุณสามารถใช้คำสั่งunsetopt nomatch
Russell Heilling

1
find -path './.*' -delete

สิ่งนี้จะตรงกับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันที่เริ่มต้นด้วย.และลบเหล่านี้ซ้ำ ไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่ไม่ได้ซ่อนจะไม่ถูกสัมผัส

ในกรณีที่คุณต้องการล้างทุกอย่างจากไดเรกทอรีfind -deleteจะพอเพียง


สิ่งนี้จะลบทุกอย่างไม่ใช่เฉพาะรายการที่ขึ้นต้นด้วย.
kasperd

โอ้ดูเหมือนว่าฉันจะอ่านคำถามผิด ๆ ว่า "ลบทุกอย่างรวมถึงไฟล์ที่ซ่อนอยู่" ...
Fritz

@ kasperd ขอบคุณตอนนี้จริง ๆ ควรตอบคำถาม
Fritz

0

วิธีที่ดีที่สุดน่าจะเป็น:

  • หา -iname. * -maxdepth 1 -type f -exec rm {} \;

เปลี่ยนrmเป็นls -lหากคุณต้องการดูว่าอะไรจะถูกลบออกเพื่อให้ verbose ผลลัพธ์ u อาจต้องการเพิ่มตัวเลือก-vเป็นrm

  • -ตัวเลือกf ประเภทบอกให้ค้นหาคำสั่งที่จะมองหาไฟล์เท่านั้น (ละเว้น dirs ลิงค์ ฯลฯ )
  • -maxdepth 1บอกว่าจะไม่ลงไปยังไดเรกทอรีย่อย

PS อย่าลืมเกี่ยวกับการสิ้นสุด '\;'


1
ระวัง! คุณหมายถึง -iname '. *' หรือ -iname. * มิฉะนั้นคุณจะลากเข้ามา และ .. อีกครั้ง
Domingo Ignacio Galdos

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

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