Pertanyaan Perintah untuk menghapus file sementara yang diakhiri dengan ~


Beberapa hari yang lalu, saya menemukan alias bash yang berguna ini (isi dari saya ~ / .bash_aliases)

# aliases

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

Sekarang saya mencoba menggunakannya rm~ setelah cd ke beberapa direktori yang berisi 3 file berakhiran ~

Saya mendapat kesalahan ini di terminal, dan file tidak terhapus

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

Juga ketika saya mencoba rm~ dari /home/me, sepertinya tidak melakukan apa-apa. Atau mungkin butuh banyak waktu.

Tolong beri tahu saya mengapa saya mendapatkan kesalahan, dan bagaimana memperbaikinya.

Terima kasih!


15
2017-12-28 08:46


asal




Jawaban:


Alias ​​bash Anda tidak ditulis dengan baik (tanda kutip tunggal tidak digunakan dengan baik). Sebaliknya seharusnya:

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

Sekarang, saya pribadi tidak suka menggunakan pipa dan tidak berguna xargs, jadi alias Anda akan lebih baik ditulis sebagai:

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

Itu -type f pilihan sehingga hanya menemukan file (bukan direktori, tautan, dll.), -v opsi untuk rm sehingga menjadi verbose (mencetak apa yang menghapusnya). Itu + pada akhirnya begitu find berjalan rm dengan semua file yang ditemukan (memunculkan hanya satu contoh rm, bukan satu per file).

Sekarang dari man bash:

Untuk hampir semua tujuan, alias digantikan oleh fungsi shell.

Alih-alih alias, lebih baik menggunakan fungsi: komentar alias Anda di .bash_aliases file (mis., taruh a # di depan garis itu), dan di dalam file .bashrc, letakkan ini fungsi (di mana saja di file, pada akhirnya baik-baik saja):

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

Juga, sebagai jawaban lain menyebutkan, Anda dapat menggunakan -delete perintah untuk menemukan. Dalam hal ini, Anda rm~ fungsi akan menjadi:

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

Bahkan, Anda dapat membuat fungsi keren yang akan membuat argumen, katakan --dry-run, itu hanya akan menghasilkan apa yang akan dihapus:

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
}

Kemudian gunakan sebagai:

rm~ --dry-run

untuk hanya menampilkan file yang akan dihapus (tetapi tidak menghapusnya) lalu

rm~

ketika kamu senang dengan ini.

Beradaptasi dan meluas ke kebutuhan Anda!

Catatan. Anda harus membuka terminal baru agar perubahan diterapkan.


26
2017-12-28 10:01



Terima kasih! Ini bekerja dengan baik, dan lari kering sangat membantu. - Vinayak Garg
find -type f -name '*~' -delete (senjata pilihan, selain itu git clean -dfx .) - sehe
Ini adalah solusi elegan, saya harus masuk hanya untuk memberi Anda alat peraga. +1 untuk Anda, teman baik saya! - CodeChimp


*~ diperluas oleh shell sebelum ditetapkan ke alias Anda. Tugas sebenarnya adalah:

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

Saya menyarankan untuk menggunakan fungsi alih-alih alias, ini jauh lebih kuat dan lebih mudah untuk menangani berkaitan dengan tanda kutip.

Sementara kita melakukannya, hapus yang berlebihan . (direktori saat ini tersirat jika tidak ada parameter yang diberikan) dan berhenti menyalahgunakan xargs sejak -delete pilihan sudah ada.

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

Itu -ls pilihan bersifat opsional, tetapi menambahkannya akan menunjukkan file mana yang telah dihapus.


9
2017-12-28 08:54



+1 Terima kasih! Tetapi di mana saya harus menambahkan fungsi ini? - Vinayak Garg
@VinayakGarg Anda dapat menambahkannya ke Anda .bash_aliases juga, tapi saya biasanya menempatkannya di dalam saya .bashrc. - Lekensteyn