คำสั่งสำหรับการลบไฟล์ชั่วคราวที่ลงท้ายด้วย ~


15

หลายวันที่ผ่านมาฉันพบชื่อแทนทุบตีที่มีประโยชน์นี้ (เนื้อหาของ~ / .bash_aliases )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

ตอนนี้ฉันพยายามใช้rm~หลังจากcdไปยังไดเรกทอรีที่มี 3 ไฟล์ที่ลงท้ายด้วย~

ฉันพบข้อผิดพลาดนี้ในเทอร์มินัลและไฟล์ไม่ถูกลบ

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

นอกจากนี้เมื่อฉันลองrm~จาก/home/meดูเหมือนว่าจะไม่ทำอะไรเลย หรืออาจใช้เวลานาน

กรุณาบอกฉันว่าทำไมฉันถึงได้รับข้อผิดพลาดและวิธีการแก้ไข

ขอบคุณ!

คำตอบ:


26

นามแฝง bash ของคุณเขียนได้ไม่ดี (ไม่ได้ใช้เครื่องหมายคำพูดเดี่ยว) มันควรจะเป็น:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

ตอนนี้ฉันไม่ชอบการใช้ท่อไร้ประโยชน์และxargsโดยส่วนตัวแล้วชื่อแทนของคุณจะถูกเขียนเป็น:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

-type fตัวเลือกเพื่อค้นหาไฟล์เท่านั้น (ไม่ไดเรกทอรีการเชื่อมโยงอื่น ๆ ) ที่-vตัวเลือกในการrmเพื่อให้เป็นไปอย่างละเอียด (พิมพ์สิ่งที่มันลบ) +ที่สิ้นสุดเพื่อให้findการทำงานrmกับไฟล์ทั้งหมดที่พบ (spawns เพียงหนึ่งตัวอย่างของrmแทนการอย่างใดอย่างหนึ่งต่อไฟล์)

ตอนนี้มาจากman bash:

เกือบทุกจุดประสงค์นามแฝงถูกแทนที่ด้วยฟังก์ชันเชลล์

แทนที่จะใช้นามแฝงคุณควรใช้ฟังก์ชั่น: แสดงความคิดเห็นนามแฝงของคุณใน.bash_aliasesไฟล์ (กล่าวคือวาง#หน้าบรรทัดนั้น) และในไฟล์.bashrcให้วางฟังก์ชันนี้(ที่ใดก็ได้ในไฟล์ท้ายที่สุดก็ใช้ได้) :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

นอกจากนี้ตามคำตอบอื่น ๆ ที่กล่าวถึงคุณสามารถใช้-deleteคำสั่งเพื่อค้นหา ในกรณีนี้rm~ฟังก์ชั่นของคุณจะเป็น:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

ในความเป็นจริงคุณสามารถสร้างฟังก์ชั่นเจ๋ง ๆ ที่จะโต้แย้งได้--dry-runว่าจะส่งออกเฉพาะสิ่งที่มันจะลบ:

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

จากนั้นใช้เป็น:

rm~ --dry-run

เพื่อแสดงเฉพาะไฟล์ที่จะถูกลบ (แต่ไม่ลบไฟล์) และจากนั้น

rm~

เมื่อคุณมีความสุขกับสิ่งนี้

ปรับและขยายความต้องการของคุณ!

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


ขอบคุณ! มันทำงานได้ดีและการวิ่งแบบแห้งมีประโยชน์อย่างยิ่ง
Vinayak Garg

2
find -type f -name '*~' -delete(อาวุธของทางเลือกนอกจากgit clean -dfx .)
sehe

2
นี่เป็นทางออกที่สง่างามฉันต้องล็อคอินเพื่อให้อุปกรณ์ประกอบฉากแก่คุณ +1 ถึงคุณเพื่อนที่ดีของฉัน!
CodeChimp

9

*~ถูกขยายโดยเชลล์ก่อนที่มันจะถูกมอบหมายให้นามแฝงของคุณ การมอบหมายที่แท้จริงคือ:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

ฉันแนะนำให้ใช้ฟังก์ชั่นแทนนามแฝงซึ่งมีประสิทธิภาพและง่ายต่อการจัดการกับคำพูด

ในขณะที่เราอยู่ที่มันให้ลบฟุ่มเฟือย.(ไดเรกทอรีปัจจุบันจะส่อให้เห็นถ้าไม่มีพารามิเตอร์ที่ได้รับ) และหยุดการละเมิดxargsเนื่องจาก-deleteตัวเลือกที่มีอยู่แล้ว

rm~() { find -name '*~' -ls -delete; }

-lsตัวเลือกเป็นตัวเลือก แต่เพิ่มจะแสดงไฟล์ที่ถูกลบไปแล้ว


+1 ขอบคุณ! แต่ฉันจะเพิ่มฟังก์ชั่นนี้ได้ที่ไหน?
Vinayak Garg

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