วิธีการลบเฉพาะเนื้อหาของไดเรกทอรี?


14

ฉันอยู่ในโฟลเดอร์: /var/myfolder.

ข้างในมีโฟลเดอร์อื่น ๆ เช่น: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/เป็นต้น

ในแต่ละไฟล์มีชื่อสุ่ม ฉันจะลบไฟล์ทั้งหมดออกจากโฟลเดอร์ทั้งหมดภายในได้/var/myfolderอย่างไร

โครงสร้าง (ไดเรกทอรีทั้งหมดเช่น., A, B, C, ฯลฯ/var/myfolder) ภายในควรจะยังคงเหมือนเดิม

คำตอบ:


17

ลอง:

find /var/myfolder -type f -delete

สิ่งนี้จะได้รับไฟล์ปกติทั้งหมดภายใต้ / var / myfolder และลบทิ้งเฉพาะไดเรกทอรี


ขอบคุณสำหรับการแก้ปัญหา ฉันควรจะพูดถึงว่าฉันกำลังทำสิ่งนี้ใน Solaris 9 ดังนั้นฉันไม่พบตัวเลือก -delete แต่นั่นเป็นจุดเริ่มต้นที่ดี
IroeN

2
ฉันสามารถหาวิธีแก้ปัญหาต่อไปนี้: find / var / myfolder -type f -exec rm -f {} \;
IroeN

2
ขอโทษ ฉันใช้ Debian หรือ Ubuntu ทางออกของคุณเทียบเท่าเท่าที่ฉันรู้
StarNamer

6
-type f! =! -type d
mikeserv

7

ด้วย zsh ให้ใช้ตัวระบุแบบ. กลมเพื่อจับคู่ไฟล์ปกติเท่านั้น:

rm -- **/*(.)

สิ่งนี้จะลบไฟล์ปกติ (ไม่ซ่อน) ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยซ้ำ เพิ่มตัวระบุDคุณสมบัติกลมเพื่อลบไฟล์ปกติที่ซ่อนอยู่ (และไฟล์ปกติในไดเรกทอรีที่ซ่อนอยู่) เช่นกัน


ฉันใช้ทุบตี
IroeN

1
@ user6554: ... ซึ่งคำถามของคุณหรือแท็กที่ใช้บ่งบอกว่า;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm ไม่ลบไดเรกทอรี - ดังนั้นเพียงแค่รันทุกอย่าง

เพื่อรักษา symlink ไปยังไดเรกทอรี:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

และฉันคิดว่าสิ่งนี้ควรจะได้ผลเช่นกันอาจเป็นวิธีที่ได้รับการปรับปรุงเล็กน้อยหากมีไฟล์จำนวนมากที่อาจต้องทำการทดสอบในเวอร์ชันด้านบน:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

โปรดทราบว่า GNU findมี-xtypeตัวเลือกสำหรับสิ่งนั้น
Stéphane Chazelas

@ StéphaneChazelas - ast ก็ทำเช่นกัน แต่ฉันไม่ต้องการความลึกเลยฉันไม่คิด ฉันเก็บไว้ในอันดับต้น ๆ เพื่อหลีกเลี่ยงข้อผิดพลาดมากมาย - เงียบหรือไม่ - แต่มันก็โง่ในคนอื่น ๆ
mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

จะลบทุกอย่างภายในโฟลเดอร์ย่อยโดยไม่ต้องสัมผัสโฟลเดอร์ย่อยด้วยตนเอง

ครั้งแรก*สำหรับไดเรกทอรีย่อยของmyfolderตัวเอง ( A, B, ... ) อย่างที่สอง*คือสำหรับไฟล์ในA,Bฯลฯ

หากมีโฟลเดอร์มากขึ้นภายในA, Bฯลฯ วิ่งครั้งแรก: ทำงานแล้วrm /var/myfolder/*/*/*rm /var/myfolder/*/*


0

คุณควรจะสามารถ cd ที่ด้านบนสุดของแผนผังไดเรกทอรีที่มีปัญหาจากนั้นเรียกใช้:

find . -type f -print0 | xargs -0 rm -rf

และที่ควรลบไฟล์ทั้งหมดในขณะที่ออกจากต้นไม้ไดเรกทอรีเหมือนเดิม ตัวเลือก -print0 และ -0 อาจถูกละเว้นหากคุณมั่นใจว่าคุณไม่มีชื่อไฟล์หรือไดเรกทอรีใด ๆ ที่มีช่องว่าง

คำสั่ง find แยกความแตกต่างระหว่างไฟล์ (-type f) และลิงก์ (-type l) ดังนั้นสิ่งนี้ควรปล่อยให้ลิงก์ไม่เสียหายหากมี ไม่ได้ทดสอบว่า หากมีข้อสงสัยให้รัน:

หา - ประเภท l

และดูว่ามีอะไรปรากฏขึ้นก่อนที่คุณจะรันคำสั่ง find ก่อนหน้าหรือไม่


คุณช่วยอธิบายได้อย่างไรว่าการrmตั้งค่าสถานะ-r, -R, --recursive - remove directories and their contents recursivelyเหมาะสมกับสิ่งนี้อย่างไร
Stephen Rauch

เนื่องจากเราไม่ได้รัน rm -rf เราจึงกำลังค้นหา -type f แล้วไพพ์เอาต์พุตจากนั้นถึง rm -rf ดังนั้นมันจึงลบไฟล์เท่านั้นมันไม่ได้สัมผัสไดเรกทอรี นั่นคือสิ่งที่ | บิต xargs ทำใช้เอาท์พุทจากคำสั่งทางซ้ายและส่งไปยังคำสั่งทางด้านขวา
rjh427

จุดของฉันอย่างแน่นอน หากคุณไม่ได้ผ่านไดเรกทอรีใด ๆ สิ่งที่ใช้เป็นธงที่ใช้งานได้เฉพาะในไดเรกทอรี?
Stephen Rauch

เพราะความจำของกล้ามเนื้อและก็ยังใช้งานได้ คุณสามารถเพิ่มคำคัดค้านที่เหมือนกันในตัวเลือก -f "force" ฉันจะให้คำตอบเดียวกัน
rjh427

-2

ใช้คำสั่งด้านล่าง:

sudo rm -rf directory_in_which_you_have_content / *

---------------- หรือ --------------------------------- -----------------------

เครื่องหมาย '*' ย่อมาจากทั้งหมดดังนั้นเมื่อคุณจะใช้ * ซึ่งจะลบเนื้อหาทั้งหมด ดังนั้นให้ใช้คำสั่งเช่นนี้หรือไปที่ไดเรกทอรีที่คุณต้องการลบเนื้อหาทั้งหมดและเพียงแค่ใช้คำสั่งด้านล่าง:

sudo rm -rf *

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