ls จะแสดงรายการไฟล์ที่ rm จะลบเสมอหรือไม่


33

สิ่งที่ฉันรู้สึกว่าฉันควรจะรู้แน่นอน: ถ้าฉันls <something>จะrm <something>ลบไฟล์เดียวกับที่lsแสดงหรือไม่ มีสถานการณ์ใดบ้างที่rmสามารถลบไฟล์ที่lsไม่แสดง (นี่คือใน 18.04 bash)

แก้ไข: ขอบคุณทุกคนที่ตอบ ฉันคิดว่าคำตอบแบบเต็มคือการรวมกันของคำตอบทั้งหมดดังนั้นฉันจึงยอมรับคำตอบที่ได้รับการโหวตมากที่สุดว่า "คำตอบ"

สิ่งที่ไม่คาดคิดที่ฉันได้เรียนรู้ระหว่างทาง:

  • ls ไม่ตรงไปตรงมาอย่างที่คุณคิดในการจัดการกับข้อโต้แย้ง
  • ในการติดตั้งอูบุนตูง่ายๆโดยใช้นามแฝง. bashrc ls
  • อย่าตั้งชื่อไฟล์ของคุณที่ขึ้นต้นด้วยเส้นประเนื่องจากมันสามารถดูเหมือนอาร์กิวเมนต์คำสั่งและการตั้งชื่อหนึ่ง -r กำลังขอมัน!

8
ฉันค่อนข้างประหลาดใจที่rmไม่มี--dry-runธง ...
fkraiem

20
@Rinzwind ทำไมจะfind -deleteจะดีกว่าrm? คุณพูดว่า"นั่นคือเหตุผล"แต่มันก็ไม่ชัดเจนสำหรับฉันในสิ่งที่อ้างอิงถึง นอกจากนี้โปรดทราบว่าfindการร้องขอของคุณจะลบไฟล์ทั้งหมดซ้ำในไดเรกทอรีปัจจุบันซึ่งrmจะลบไฟล์ในไดเรกทอรีทันที ยัง-name *เป็นแบบไม่มี op ทั้งหมดในทุกฉันค่อนข้างงงงวยโดยคำแนะนำของคุณ ...
marcelm

3
@marcelm ผมคิดว่าคำแนะนำสำหรับการใช้เป็นเพราะคุณสามารถเรียกดูไฟล์ทั้งหมดแล้วเรียกใช้คำสั่งเช่นเดียวกันกับfind -deleteเนื่องจากคุณเห็นผลลัพธ์จากfindแล้วไม่ควรมีความกำกวมในสิ่งที่จะถูกลบออก (จริง ๆ แล้วฉันอยากจะได้ยินรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ในรูปแบบของคำตอบ)
Scribblemacher

5
@Scribblemacher "... คุณสามารถเรียกใช้ดูไฟล์ทั้งหมดแล้วเรียกใช้คำสั่งเดียวกันกับ-delete" - แต่จะดีกว่าการใช้งานls <filespec>อย่างไรตามด้วยrm <filespec>(ซึ่ง OP รู้วิธีการทำอยู่แล้ว)?
marcelm

12
@Rinzwind "ที่แก้คำตอบของ choroba ทันทีที่ไฟล์ถูกสร้างขึ้นหลังจาก ls และก่อน rm." - ไม่ไม่ได้ หากคุณเรียกใช้find ... -printก่อนเพื่อยืนยันว่าจะลบไฟล์ใดจากนั้นfind ... -deleteคุณจะยังคงลบไฟล์ที่สร้างระหว่างคำสั่งสองคำ หากคุณใช้ทั้งสองอย่าง-printและ-deleteคุณจะไม่ได้รับการยืนยันเพียงรายงานตามความเป็นจริงของสิ่งที่ถูกลบไป (และคุณอาจใช้เช่นกันrm -v)
marcelm

คำตอบ:


40

ทั้งคู่lsและrmดำเนินการกับข้อโต้แย้งที่ส่งผ่านไปยังพวกเขา

อาร์กิวเมนต์เหล่านี้อาจเป็นไฟล์แบบง่ายดังนั้นls file.extและrm file.extดำเนินการกับไฟล์เดียวกันและผลลัพธ์นั้นชัดเจน (แสดงรายการไฟล์ / ลบไฟล์)

หากอาร์กิวเมนต์แทนเป็นไดเรกทอรีให้ls directoryแสดงรายการเนื้อหาของไดเรกทอรีในขณะที่rm directoryจะไม่ทำงานตามที่เป็นอยู่ (เช่นrmไม่มีแฟล็กไม่สามารถลบไดเรกทอรีได้ในขณะที่คุณทำอยู่rm -r directoryก็จะลบไฟล์ทั้งหมดภายใต้directory และไดเรกทอรีเองซ้ำ)

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

เป็นตัวอย่างที่ดีls $(rand).txtและคิดว่าrm $(rand).txtข้อโต้แย้งนั้น "เหมือนกัน" แต่ผลลัพธ์นั้นแตกต่างกันมาก!


3
ยังพิจารณาlsเทียบกับrm *ที่มี "ซ่อน" (dot) ls *ไฟล์แม้ว่าว่าไม่ได้อยู่ที่การเปรียบเทียบยุติธรรมที่ผมไม่ได้เขียน แต่rmไม่มีความหมายในตัวมันเองดังนั้นสิ่งทั้งปวงคือแอปเปิ้ลและส้มจริงๆ ถ้าฉันเข้าใจถูกต้องนั่นเป็นคำตอบของคุณนั่นเป็นงานที่ดีมาก :)
Lightness Races กับ Monica

5
ความคิดเห็นอื่นเกี่ยวlsกับ vs rm -r: คำสั่งls <directory>จะไม่แสดงไฟล์ที่ซ่อนอยู่ภายในไดเรกทอรี แต่rm -r <directory> จะลบแม้กระทั่งไฟล์ที่ซ่อนอยู่
Daniel Wagner

1
@LightnessRacesinOrbit lsจะไม่แสดงรายการ (ยกเว้นว่าจะเป็นนามแฝงls -a) และrm *จะไม่ลบออก (เว้นแต่คุณจะdotglobตั้งค่าไว้)
หยุดทำร้ายโมนิก้า

20

หากคุณกำลังนึกถึงบางสิ่งบางอย่างเช่นls foo*.txtvs. rm foo*.txtแล้วก็ใช่พวกเขาจะแสดงและลบไฟล์เดียวกัน เชลล์ขยาย glob และส่งผ่านไปยังคำสั่งที่เป็นปัญหาและคำสั่งจะทำงานกับไฟล์ที่อยู่ในรายการ หนึ่งรายการพวกเขาหนึ่งคนลบ

ความแตกต่างที่ชัดเจนคือถ้าไฟล์ใด ๆ ที่เกิดขึ้นเป็นไดเรกทอรีจากนั้นlsจะแสดงรายการเนื้อหา แต่rmจะไม่สามารถลบมันได้ ที่มักจะไม่เป็นปัญหาเนื่องจากrmจะเอาน้อยlsกว่าสิ่งที่ถูกนำมาแสดงโดย

ปัญหาใหญ่ที่นี่มาจากการทำงานls *หรือrm *ในไดเรกทอรีที่มีชื่อไฟล์ที่เริ่มต้นด้วยเส้นประ พวกเขาจะขยายไปยังบรรทัดคำสั่งของสองโปรแกรมราวกับว่าคุณเขียนออกมาเองและlsจะ-rหมายถึง "reverse sort order" ในขณะที่rmจะ-rหมายถึงการลบแบบเรียกซ้ำ ความแตกต่างนั้นสำคัญหากคุณมีไดเรกทอรีย่อยอย่างน้อยสองระดับ ( ls *จะแสดงเนื้อหาของไดเรกทอรีระดับแรก แต่rm -r *ทุกอย่างจะผ่านระดับย่อยแรกไปด้วย)

เพื่อหลีกเลี่ยงปัญหานี้ให้เขียน globs ที่อนุญาตพร้อมกับตัวนำ./เพื่อระบุไดเรกทอรีปัจจุบันและ / หรือใส่--เพื่อส่งสัญญาณการสิ้นสุดของการประมวลผลตัวเลือกก่อนหน้า glob (เช่นrm ./*หรือrm -- *)

ด้วย glob เช่น*.txtที่เป็นจริงไม่เป็นปัญหาตั้งแต่จุดเป็นตัวละครตัวเลือกที่ไม่ถูกต้องและจะทำให้เกิดข้อผิดพลาด (จนกว่าจะมีคนขยายสาธารณูปโภคที่จะคิดค้นความหมายสำหรับมัน) แต่ก็ยังคงมีความปลอดภัยมากขึ้นที่จะนำ./มีอยู่แล้ว


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


1
ขอขอบคุณ. ดูเหมือนว่าจะเน้นปัญหาเกี่ยวกับไวยากรณ์บรรทัดคำสั่งทั้งหมด: หากคุณตั้งชื่อไฟล์ที่ขึ้นต้นด้วยเส้นประคุณกำลังแล่นในน่านน้ำอันตราย ใครจะรู้ว่าคำสั่งที่คุณอาจใช้ในอนาคตนานแค่ไหนหลังจากที่คุณลืมเกี่ยวกับ - ไฟล์
B.Tanner

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

3
ฉันไม่สามารถต้านทานคุณขายให้ฉันฉันปิดเพื่ออ่านตอนนี้มีความทรงจำของเวลาที่ฉันได้รับอักขระคืนค่าขนส่งในตอนท้ายของชื่อไฟล์มากมาย (พยายามดูว่าฉันสามารถ สร้างไฟล์แบตช์ของ Windows ที่สามารถรันเป็นสคริปต์ทุบตีได้ ... ฉันไม่เห็นว่ามีคนกำลังมา!)
B.Tanner

17

ออกจากพฤติกรรมของกระสุนเรามามุ่งเน้นที่อะไรrmและlsสามารถจัดการกับตัวเอง กรณีอย่างน้อยหนึ่งที่lsจะแสดงสิ่งที่rmไม่สามารถลบเกี่ยวข้องกับสิทธิ์ directory และอื่น ๆ - ไดเรกทอรีพิเศษและ...

สิทธิ์ของโฟลเดอร์

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

ดังนั้นคุณอาจได้เป็นอย่างดีได้อ่านและผู้สิทธิ์ในไดเรกทอรีซึ่งจะช่วยให้คุณสามารถสำรวจไดเรกทอรีและดูเนื้อหาภายในได้ดีเช่น ls /bin/echoแต่คุณไม่สามารถrm /bin/echoยกเว้นกรณีที่คุณเป็นเจ้าของหรือยกระดับสิทธิพิเศษของคุณด้วย/bin sudo

และคุณจะเห็นกรณีเช่นนี้ทุกที่ นี่เป็นกรณีดังกล่าวหนึ่งกรณี: https://superuser.com/a/331124/418028


ไดเรกทอรีพิเศษ '.' และ '.. '

อีกกรณีพิเศษคือ.และ..ไดเรกทอรี ถ้าคุณทำls .หรือls ..มันอย่างมีความสุขจะแสดงเนื้อหา แต่rm'ไอเอ็นจีพวกเขาไม่ได้รับอนุญาต:

$ rm -rf .
rm: refusing to remove '.' or '..' directory: skipping '.'

15

ถ้าคุณพิมพ์ls *และจากนั้นrm *ก็เป็นไปได้ที่คุณจะลบไฟล์มากกว่าlsแสดงให้เห็นว่า - พวกเขาจะได้รับการสร้างขึ้นในช่วงเวลาเล็ก ๆ ระหว่างปลายของและจุดเริ่มต้นของlsrm


1
นั่นเป็นกรณีที่น่าจะเป็นสำหรับที่ใช้งานจำนวนมากสามารถสร้างไฟล์ชั่วคราวเพื่อให้เป็นไปได้เสมอในคำสั่งทั้งที่มี/tmp *อย่างไรก็ตามแอพพลิเคชั่นบางตัวยังสร้างไฟล์ที่ไม่ระบุตัวตนโดยเปิดunlink()ไว้ในขณะที่เปิดการจัดการไฟล์ไว้ดังนั้นมันอาจแสดงผลในls *แต่rm *อาจไม่สามารถตรวจจับได้
Sergiy Kolodyazhnyy

1
@OrangeDog คุณไม่มีจุด เรากำลังพูดถึงสภาพการแข่งขัน
Sergiy Kolodyazhnyy

1
@ OrangeDog ฉันจะต้องตรวจสอบสิ่งนี้ตั้งแต่ฉันอยู่ในโทรศัพท์ตอนนี้ แต่ประเด็นก็ยังคงอยู่แม้ว่าจะ*มีความแตกต่างระหว่างสิ่งที่lsจะแสดงและสิ่งที่rmทำงานอยู่เพราะรายชื่อของเนื้อหาไดเรกทอรีมีการเปลี่ยนแปลงในระหว่าง
Sergiy Kolodyazhnyy

1
แม้ว่าคุณจะทำเพียงคำสั่งเดียวก็ยังมีเงื่อนไขแย่งกันระหว่างการขยายข้อโต้แย้งและการลบมัน
หยุดทำร้ายโมนิก้า

1
@ OrangeDog ฉันสามารถเห็นด้วยกับที่ เนื่องจากการขยายตัวไวด์การ์ดทำงานบนชื่อไฟล์ที่มีอยู่ใช่มีสภาพการแย่งชิงระหว่างเชลล์ที่ขยายตัวไวด์การ์ดและคำสั่งในการประมวลผลดังนั้นls *ในความเป็นจริงอาจแสดงชื่อไฟล์ที่หายไปแล้ว
Sergiy Kolodyazhnyy

9

ls *และrm *จะไม่รับผิดชอบต่อการขยาย glob - ที่ทำโดยเปลือกก่อนส่งผ่านไปยังคำสั่ง

ซึ่งหมายความว่าคุณสามารถใช้คำสั่งใด ๆกับตัวขยายชื่อไฟล์ - ดังนั้นฉันจะใช้สิ่งที่ทำน้อยที่สุด

ดังนั้นวิธีที่ดีกว่าในการทำเช่นนี้ (หรืออย่างน้อยที่สุดอีกวิธีหนึ่ง) คือการข้ามคนกลาง

echo *จะแสดงให้คุณเห็นอย่างชัดเจนว่าอะไรจะผ่านไปยังrmคำสั่งของคุณ


2
ขอบคุณฉันชอบความคิดในการใช้ echo แทน ls ในสถานการณ์นี้
B.Tanner

3
หรือprintf "%s\n" *รับมุมมองที่ชัดเจนในชื่อไฟล์ด้วยช่องว่าง (หรือ%qแทนที่จะจัดการกับการขึ้นบรรทัดใหม่และอักขระควบคุมด้วยค่าใช้จ่ายของการส่งออกที่น่า
เกลียด

4

เกี่ยวกับ:

$ mkdir what
$ cd what
$ mkdir -p huh/uhm ./-r
$ ls *
uhm
$ rm *
$ ls
-r
$ ls -R
.:
-r

./-r:

โดยทั่วไปสัญลักษณ์แทนการขยายไปยังสิ่งที่เริ่มต้นด้วย-(หรือป้อนสิ่งที่ตนเองเริ่มต้นด้วย-แต่รูปลักษณ์ที่เป็นบิตมากขึ้นเช่นการโกง) อาจจะตีความแตกต่างกันโดยและlsrm


4

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

% ln -s $HOME some_link
% ls some_link    # Will display directory contents  
bin    lib    Desktop ...
% rm some_link
% ls $HOME
bin    lib    Desktop ...

1
ฮะ. ln -s $HOME some_link; ls some_linkเอาท์พุทsome_link@สำหรับฉัน แต่ฉันได้นามแฝงls ls -Fเห็นได้ชัดว่า-Fเปลี่ยนพฤติกรรมการแสดงลิงค์แทนการลงทะเบียน ไม่ได้คาดหวังว่า
marcelm

แน่นอน! นอกจากนี้ยังls -lยกตัวอย่างเช่นเป้าหมายการเชื่อมโยงที่ไม่ปลายทาง ... มีจะต้องมีวิธีการที่จะตรวจสอบการเชื่อมโยงตัวเอง
อเล็กซิส

1
การเพิ่มตัวเลือกคำถามที่เปิดขึ้นมากเกินไป possibilities-- คำตอบของฉันเป็นเรื่องเกี่ยวกับพฤติกรรมที่ไม่มีการแก้ไขของและls rm
อเล็กซิส

ถ้าคุณบอกว่าls some_link/,  ls -H some_linkหรือls -L some_linkมันจะมีรายการที่เชื่อมโยงไปยังไดเรกทอรีแม้ว่าคุณจะเพิ่มหรือ-F -lตรงกันข้าม (เรียงลำดับจาก) -dบอกว่าจะดูไดเรกทอรีมากกว่าเนื้อหา; เปรียบเทียบและls -l /tmp ls -ld /tmp
G-Man กล่าวว่า 'Reinstate Monica'

lsแน่นอนว่าคุณสามารถเพิ่มธงที่มีการเปลี่ยนแปลงลักษณะการทำงานของ คุณแสดงให้เห็นว่าทำไมการแจกแจงพฤติกรรมด้วยค่าสถานะที่แตกต่างกันนั้นไม่คุ้มค่ากับคำถามนี้ ...
alexis

4

ถ้าคุณทำเพียงlsแทนls -aใช่rmสามารถลบไฟล์ที่ซ่อนอยู่คุณยังไม่เห็นด้วยโดยไม่ต้องls-a

ตัวอย่าง:

ตาม:

dir_test
├── .test
└── test2

ls dir_test : จะแสดงเฉพาะ test2

ls -A dir_test : จะแสดง test2 + .test

rm -r dir_test : จะลบทั้งหมด (.test + test2)

ฉันหวังว่าจะช่วยคุณ


คุณสามารถยกตัวอย่างได้หรือไม่? เพราะปกติrm *จะไม่ลบ dotfiles ถ้ามีls *จะแสดงด้วย
marcelm

ไม่ไม่ls *ต้องแสดงไฟล์ที่ซ่อนอยู่
DevHugo

แต่ใช่มันสับสนเล็กน้อยฉันได้เพิ่มตัวอย่างบางส่วน
DevHugo

1
ls -aจะมีรายการ., .., และ.test test2คุณอาจต้องการเปลี่ยนตัวอย่างของคุณเพื่อใช้ls -Aซึ่งจะแสดงรายการทุกอย่างยกเว้น .และ..(เช่นเท่านั้น.testและtest2)
G-Man กล่าวว่า 'Reinstate Monica'

3

มีคำตอบที่ดีอยู่แล้ว แต่ฉันต้องการเพิ่มความเข้าใจที่ลึกซึ้งยิ่งขึ้น

ถามคำถามกับตัวเองว่ามีพารามิเตอร์กี่ตัวที่ส่งผ่านlsถ้าคุณเขียน

ls *

... ? โปรดทราบว่าlsคำสั่งไม่ได้รับ*พารามิเตอร์ as หากมีไฟล์ใด ๆ ที่*สามารถขยายได้ แต่ก่อนอื่นเชลล์จะทำการ globbing ก่อนที่จะเรียกใช้คำสั่งดังนั้นlsคำสั่งจะได้รับพารามิเตอร์มากเท่าที่มีไฟล์ที่จับคู่โดยการวนรอบ หากต้องการระงับการวนรอบให้อ้างอิงพารามิเตอร์

นี้เป็นจริงสำหรับคำสั่งใด ๆ : VSecho *echo '*'

มีสคริปต์เรียกมันcountparams.shเพื่อทดสอบผลกระทบ มันบอกคุณว่ามันผ่านพารามิเตอร์จำนวนหนึ่งและรายการพวกเขา

#!/bin/bash
echo "This script was given $# parameters."
arr=( "$@" )
for ((i=0;i<$#;i++)); do
        echo "Parameter $((i+1)): ${arr[$i]}"
done

ทำให้สามารถเรียกใช้และรัน./countparams.sh *ได้ เรียนรู้จากผลลัพธ์!


1

glob จะขยายแบบเดียวกันทั้งสองครั้งหากเนื้อหาไดเรกทอรีเหมือนกันในช่วงเวลาที่ต่างกัน


rm -i *.txtถ้าคุณอยากจะตรวจสอบสิ่งที่จะถูกนำออกใช้ มันจะแจ้งให้คุณแยกต่างหากสำหรับแต่ละไฟล์ก่อน (พยายาม) ลบออก

สิ่งนี้รับประกันได้ว่าปลอดภัยต่อสภาพการแข่งขัน:
        ls *.txt/ ไฟล์ใหม่ถูกสร้างขึ้น / rm *.txt
เนื่องจากคุณได้รับพร้อมท์สำหรับทุกไฟล์โดยโปรแกรมเดียวกันที่ทำการลบ


นี้จะยุ่งยากเกินไปสำหรับการใช้งานปกติและถ้าคุณนามแฝงrmที่จะrm -iคุณจะพบว่าตัวเองใช้\rmหรือrm -fค่อนข้างบ่อย แต่มันก็คุ้มค่าอย่างน้อยพูดถึงว่ามีทางออกให้กับสภาพการแข่งขัน (มันเป็นแบบพกพาแม้กระทั่งกับระบบที่ไม่ใช่ GNU: POSIX rm(1)ระบุ-iตัวเลือก )

อีกตัวเลือกหนึ่งที่จะเป็นอาร์เรย์ทุบตี: to_remove=(*.txt)แล้วขอให้ผู้ใช้ยืนยัน (บางทีหลังจากทำls -ld -- "${to_remove[@]}") rm -- "${to_remove[@]}"แล้ว ดังนั้นการขยายตัว glob rmจะทำเพียงครั้งเดียวและรายการจะถูกส่งผ่านไปยังคำต่อคำ

อีกตัวเลือกที่ใช้งานได้จริงก็คือ GNU rm -I( หน้าคน ) ซึ่งจะแจ้งให้หากลบมากกว่า 4 รายการ (แต่ไม่แสดงรายการให้คุณเห็นเพียงยอดรวม) ฉันใช้alias rm='rm -I'บนเดสก์ท็อป

มันเป็นการป้องกันที่ดีต่อการกลับมาอ้วนแบบมีครึ่งพิมพ์ที่ตรงกับมากเกินไป แต่โดยlsทั่วไปการใช้อันดับแรกนั้นดีในไดเรกทอรีที่คุณเป็นเจ้าของหรือในระบบผู้ใช้คนเดียวและเมื่อไม่มีกระบวนการพื้นหลังที่สามารถสร้างไฟล์ใหม่แบบอะซิงโครนัสได้ เพื่อป้องกันนิ้วอ้วนอย่าพิมพ์rm -rf /foo/bar/bazจากซ้ายไปขวา rm -rf /เป็นกรณีพิเศษ แต่rm -rf /usrไม่ใช่! ออกจาก-rfส่วนหรือเริ่มต้นด้วยlsและเพิ่มเฉพาะrm -rfส่วนหลังจากพิมพ์เส้นทาง

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