สิ่งนี้ตั้งใจจะทำอย่างไร
ls
แสดงรายการไฟล์ในไดเรกทอรีปัจจุบัน
$(ls)
ทดแทนเอาต์พุตของls
ตำแหน่งที่เป็นอาร์กิวเมนต์rm
rm $(ls)
เป็นหลักมีวัตถุประสงค์เพื่อลบไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน
ภาพนี้มีอะไรผิดปกติ?
ls
ไม่สามารถจัดการอักขระพิเศษในชื่อไฟล์ได้อย่างถูกต้อง ผู้ใช้ระบบปฏิบัติการยูนิกซ์โดยทั่วไปแนะนำให้ใช้วิธีการที่แตกต่างกัน ฉันได้แสดงให้เห็นว่าในคำถามที่เกี่ยวข้องเกี่ยวกับชื่อไฟล์นับ ตัวอย่างเช่น
$ touch file$'\n'name
$ ls
file?name
$ rm $(ls)
rm: cannot remove 'file': No such file or directory
rm: cannot remove 'name': No such file or directory
$
นอกจากนี้ตามที่ระบุไว้อย่างถูกต้องในคำตอบของเดนิสชื่อไฟล์ที่มีเครื่องหมายขีดกลางสามารถตีความได้ว่าเป็นอาร์กิวเมนต์rm
หลังจากการแทนที่ซึ่งเอาชนะวัตถุประสงค์ของการลบชื่อไฟล์
งานอะไร
คุณต้องการลบไฟล์ในไดเรกทอรีปัจจุบัน ดังนั้นใช้ glob rm *
:
$ ls
file?name
$ rm $(ls)
rm: cannot remove 'file': No such file or directory
rm: cannot remove 'name': No such file or directory
$ rm *
$ ls
$
คุณสามารถใช้find
คำสั่ง แนะนำให้ใช้เครื่องมือนี้บ่อย ๆ มากกว่าแค่ไดเรกทอรีปัจจุบันมันสามารถท่องไปทั่วทั้งไดเรกทอรีต้นไม้และเรียกใช้ไฟล์ผ่าน-exec . . .{} \;
$ touch "file name"
$ find . -maxdepth 1 -mindepth 1
./file name
$ find . -maxdepth 1 -mindepth 1 -exec rm {} \;
$ ls
$
Python ไม่มีปัญหาเกี่ยวกับอักขระพิเศษในชื่อไฟล์ดังนั้นเราสามารถใช้งานได้เช่นกัน (โปรดทราบว่าอันนี้มีไว้สำหรับไฟล์เท่านั้นคุณจะต้องใช้os.rmdir()
และos.path.isdir()
ถ้าคุณต้องการใช้งานในไดเรกทอรี):
python -c 'import os; [ os.remove(i) for i in os.listdir(".") if os.path.isfile(i) ]'
ในความเป็นจริงคำสั่งข้างต้นสามารถเปลี่ยนเป็นฟังก์ชั่นหรือนามแฝงใน~/.bashrc
เพื่อความกะทัดรัด ตัวอย่างเช่น,
rm_stuff()
{
# Clears all files in the current working directory
python -c 'import os; [ os.remove(i) for i in os.listdir(".") if os.path.isfile(i) ]'
}
รุ่น Perl ของที่จะเป็น
perl -e 'use Cwd;my $d=cwd();opendir(DIR,$d); while ( my $f = readdir(DIR)){ unlink $f;}; closedir(DIR)'