rm -rf * จะลบไฟล์ / โฟลเดอร์ทั้งหมดในไดเรกทอรีปัจจุบันหรือไม่?


20

จะrm -rf *ลบไฟล์ / โฟลเดอร์ทั้งหมดในไดเรกทอรีปัจจุบันหรือไม่ ฉันต้องการตรวจสอบให้แน่ใจว่าสัญลักษณ์ตัวแทน*จะไม่เลื่อนขึ้นในไดเรกทอรีด้านบนและลบระบบไฟล์ทั้งหมดของฉัน : D

ฉันจำได้ว่าต้องทำchmod 777 .* -Rกับchmodไฟล์ที่ซ่อนอยู่และมันก็ทำchmodระบบไฟล์ทั้งหมดของฉัน เห็นได้ชัดว่าฉันอยู่ในบัญชีรูท


1
นี่คือเหตุผลที่ฉันทำrm -rf ./*และระบุไดเรกทอรีปัจจุบันอย่างชัดเจน ... แต่ดูเหมือนว่า Ankur จะบอกว่ามันไม่สำคัญเลย
mpen

@ Mark: อะไรคือความแตกต่างระหว่าง .. และ. / .. คุณสามารถลอง cd ./ .. และดูว่าคุณอยู่ที่ไหน :)
Johan

@Johan: ไม่แตกต่างกัน ... ฉันเดาว่ามันสมเหตุสมผลมากในหัวบ้าของฉัน: D
mpen

@ Mark: ความผิดพลาดง่าย ๆ ที่ต้องทำ :)
Johan

คำตอบ:


15

.ไม่มีถ้าคุณไม่ได้ปรับแต่งเปลือกของคุณจำนวนมากนี้จะไม่ลบไฟล์หรือไดเรกทอรีที่เริ่มต้นด้วย หากต้องการลบพวกเขาเช่นกันคุณสามารถระบุได้อย่างชัดเจน

rm -rf .file .dir

หรือใช้รูปแบบ glob ขวา (ขอบคุณ Chris)

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

แก้ไขจุดนี่คือการที่คุณไม่สามารถใช้.*เพื่อให้ตรงกับไฟล์เช่น.fileเพราะ.*หรือ.*?ยังจะตรงหรือ.. จับคู่ไฟล์เช่นในขณะที่จับคู่ไฟล์เช่น( ตรงกับศูนย์หรือมากกว่าตัวอักษรในขณะที่ตรงกับหนึ่งไฟล์)..[^.]*.file..?*..foo*?


1
คุณต้องการบางสิ่งเช่น..?*จับรายการที่ขึ้นต้นด้วย“ .. ” (เช่น..foo)
Chris Johnsen

@ Chris: OK ผมเริ่มนี้บ้าจู้จี้จุกจิกคุณมีสิทธิ;)
เบนจามิน Bannier

ไม่เพียง แต่ใช้รูปแบบ glob ที่ "ถูกต้อง" เท่านั้น แต่ยังเกี่ยวกับปริมาณของรายการที่จับคู่ด้วย ในไดเรกทอรีที่มีเป็นจำนวนมากของไฟล์เปลือกเป็นส่วนใหญ่มีแนวโน้มไม่สามารถที่จะให้ 50k rmไฟล์ในหนึ่งหันไป ดังนั้นการลบเนื้อหาของไดเรกทอรีด้วย * ไม่ใช่วิธีที่ฉลาดที่สุด imho
akira

ฉันคิดว่าการอธิบายxargsนั้นอยู่นอกเหนือขอบเขตของคำถามนี้เล็กน้อย หนึ่งอาจเริ่มคิดเกี่ยวกับการที่เมื่อเปลือกบ่นรายการอาร์กิวเมนต์ความยาว
Benjamin Bannier

1
ฉันคิดว่ามันไม่ได้อยู่นอกขอบเขตเพราะฉันคิดว่า OP ไม่แน่ใจว่าจะบรรลุปัญหาหรือวิธีแก้ไขปัญหาขั้นสุดท้ายของเขาได้อย่างไร: ลบเนื้อหาทั้งหมดของไดเรกทอรี OP เป็นเพียงการทำสิ่งที่ "ผิดปกติ" โดยมีวิธีแก้ไขปัญหา (สิ่งที่ไม่ดี) อยู่ในใจและถามว่าทำไมวิธีนี้จึงทำให้เกิดปัญหา วิธีที่ดีกว่าคือ: "วิธีลบไฟล์ทั้งหมดในไดเรกทอรีโดยไม่ต้องลบไดเรกทอรีเอง" วิธีการแก้ปัญหาของ OP จะทำให้เกิดปัญหาเนื่องจากธรรมชาติของการทำงานแบบกลม
akira

12

หากคุณต้องการลบไดเรกทอรีและเนื้อหาทั้งหมดคุณสามารถchdirเข้าไปยังไดเรกทอรีหลักและไดเรกทอรีนั้นrm -rfด้วยชื่อโดยข้ามคำถาม globbing ทั้งหมด ถ้าคุณต้องการที่จะลบเนื้อหา แต่เก็บไดเรกทอรีมันง่ายที่สุดที่จะลบทั้งหมดแล้วสร้างไดเรกทอรีใหม่

มันซับซ้อนที่จะเกิดขึ้นกับ glob ที่จะตรงกับรายการไดเรกทอรีที่เป็นไปได้ทั้งหมดที่บันทึก และ .. ; มันง่ายที่จะเกิดขึ้นกับคำตอบง่ายๆ (เช่น* .??*) ที่จะทำงานได้เกือบตลอดเวลา ls -aนี่คือตกลงสำหรับการใช้งานแบบโต้ตอบเพราะมันง่ายต่อการจำและเวลามันไม่ได้ทำงานสามารถจับกับการโพสต์ RM สำหรับสคริปต์การลบทั้งหมดและสร้างไดเรกทอรีว่างใหม่ทำได้ง่ายขึ้น


1
นั่นคือสิ่งที่ฉันอยากจะแนะนำเช่นกัน: ทิ้งไดเร็กตอรี่ไปแล้ว
กิระ

แม้เจ้าจะไม่ใช่คำตอบมันเป็นความคิดที่ดี
Johan

10

เนื่องจากฉันคิดว่าคำถามนี้เกี่ยวกับสิ่งที่ * ทำ (ไม่ใช่ไม่ใช่ rm) ให้ลองใช้วิธีอื่น


หากคุณไม่แน่ใจในสิ่งที่ * ทำคุณสามารถ "ทดสอบ" ก่อนโดยใช้คำสั่งที่ไม่เป็นอันตรายเช่น echo ก่อนที่คุณจะเรียกใช้สิ่งนี้ให้ลองเดาว่าพวกเขาจะแสดงอะไรถ้าคุณเรียกใช้พวกมันใน dir ที่บ้านของคุณ

echo *
echo .*

แต่ก่อนอื่นเรามาสร้างสนามเด็กเล่นกันเพื่อที่เราจะได้เล่นกับดวงดาวและดูว่าเราจะจบลงด้วย

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

ตอนนี้เรามีสิ่งนี้:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

ตอนนี้สังเกตสิ่งที่ * ขยายเข้าไปในการใช้คำสั่ง echo:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

ลองดูว่าเกิดอะไรขึ้นกับคำสั่ง rm

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

อย่างที่คุณเห็นเขาเพิ่งลบไฟล์ 2 เท่านั้นเนื่องจาก * ขยายเป็น file2 เท่านั้น หากคุณต้องการพิมพ์ rm -rf. * ซึ่งจะเหมือนกับการเขียน

rm -rf . .. .file1

และบอกตามตรงว่าไม่สนุก;)

หวังว่าสิ่งนี้จะอธิบายส่วนของคำถามของคุณได้อย่างชัดเจน


อัปเดต: อย่างไรก็ตามตามที่ Ankur Goel ชี้ให้เห็นว่ามีการป้องกันบางอย่างในตัว rm (ชนิดที่ผิดปกติสำหรับคำสั่งเชลล์ :)

มาสร้างสนามเด็กเล่นใหม่กัน:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

ดังนั้นตอนนี้เรามีสิ่งนี้อีกครั้ง แต่ด้วย root test1 ที่เป็นเจ้าของโดยมีการป้องกันถ้า rm เริ่มมีปัญหามากขึ้น

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

ดังนั้นเราจะลบทุกอย่าง:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

และดูเหมือนว่า RM ไม่ได้ลบ และ .. ถึงแม้ว่าเราจะบอกให้เขา !!!

ดังนั้นหลังจากคำตอบที่ยาวนานมันกลับกลายเป็นว่าปลอดภัยที่จะลบทุกอย่างใน dir ด้วยวิธีนี้:

rm -rf * .*

แต่ฉันจะใช้มันด้วยความระมัดระวังเนื่องจากฉันไม่แน่ใจว่าการใช้งาน rm ทั้งหมดจะทำงานแบบนี้!


7

ใช่. rm -rf จะลบไฟล์และโฟลเดอร์ในไดเรกทอรีปัจจุบันเท่านั้นและจะไม่ขึ้นโครงสร้างไฟล์ rm จะไม่ติดตาม symlinks และลบไฟล์ที่ชี้ไปด้วยดังนั้นคุณจะไม่ตัดส่วนอื่น ๆ ของระบบไฟล์ของคุณโดยไม่ตั้งใจ


1

หากคุณไม่ต้องการเลื่อนระดับหนึ่งเหมือน mpez0 ที่กล่าวไว้และrm -rfโฟลเดอร์เฉพาะนี้มีวิธีการทำงานกับทุกไดเรกทอรี / ไฟล์ยกเว้น.และ..ในโฟลเดอร์ปัจจุบันโดยทำ:

rm -rf $(ls -A)

แน่นอนถ้าหนึ่งในไดเรกทอรี / ไฟล์มีหนึ่งในอักขระในIFSตัวแปรพิเศษของเชลล์(เช่น space, tab, newline) คุณอาจต้องการเปลี่ยน IFS ก่อนเรียกใช้คำสั่งจากนั้นเรียกคืนคำสั่ง IFS


0

วิธีที่ง่ายกว่ามากในการทำให้โฟลเดอร์ทั้งหมดว่างเปล่ารวมทั้งหลีกเลี่ยงปัญหา "อาร์กิวเมนต์มากเกินไป" ที่กล่าวถึงในคำตอบนี้ก็คือการลบและสร้างไดเรกทอรีเองใหม่ เพื่อให้แน่ใจว่าสิ่งนี้ทำงานได้อย่างถูกต้องเมื่อคุณอยู่ในไดเรกทอรี symlinked ให้ใช้บรรทัดต่อไปนี้:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(หากคุณใช้yourdirแทนคุณ$(readlink -f yourdir)จะแทนที่ลิงก์ในขณะที่ตำแหน่งเดิมยังคงเต็ม)


1
สิ่งนี้สามารถแบ่งสิ่งต่าง ๆ ที่อาศัยไอโหนดและทิ้งสิทธิ์ atime / mtime / ctime / btime แอตทริบิวต์เพิ่มเติมและรายการควบคุมการเข้าถึง
Daniel Beck

@DanielBeck ขอบคุณจุดดี แม้ว่าฉันจะสงสัยว่าสิ่งใดที่จะใช้ไอโหนดนอกเหนือจากการเชื่อมโยง (ในไดเรกทอรีซึ่งมีกำลังใจอย่างมาก) แต่การอนุญาต ฯลฯ เป็นสิ่งสำคัญ ดังนั้นในที่สุดคนหนึ่งทั่วไปกรณีที่ควรอาจจะใช้xargs...
โทเบียส KIENZLER

OS X มีกลไกที่สามารถจัดการไฟล์และโฟลเดอร์ที่ถูกย้ายไปมาและยังคงความสัมพันธ์ เห็นได้ชัดที่สุดในเปิดเอกสารล่าสุดเมนู AFAICT ใช้ inodes เพื่อทำให้สำเร็จภายใน ข้อมูลเพิ่มเติม ฉันจะไม่แปลกใจถ้าระบบอื่นใช้สิ่งที่คล้ายกันเช่นใน API สำหรับโปรแกรม GUI
Daniel Beck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.