Perintah untuk menghapus file sementara diakhiri dengan ~

15

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

# aliases

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

Sekarang saya mencoba menggunakan rm~setelah cdke beberapa direktori yang berisi 3 file yang berakhir dengan~

Saya mendapatkan 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, tampaknya akan melakukan apa-apa. Atau mungkin butuh banyak waktu.

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

Terima kasih!

Vinayak Garg
sumber

Jawaban:

26

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 yang tidak berguna dan xargs, jadi alias Anda akan lebih baik ditulis sebagai:

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

The -type fpilihan sehingga untuk menemukan hanya file (tidak direktori, link, dll), -vpilihan untuk rmsehingga menjadi verbose (cetak apa menghapus itu). Itu +di akhir sehingga findberjalan rmdengan semua file yang ditemukan (hanya memunculkan satu contoh rm, bukan satu per file).

Sekarang dari man bash:

Untuk hampir setiap tujuan, alias digantikan oleh fungsi shell.

Alih-alih alias, lebih baik menggunakan fungsi: komentari alias Anda di .bash_aliasesfile (yaitu, letakkan #di depan baris itu), dan di file .bashrc, letakkan fungsi ini (di mana saja dalam file, pada akhirnya baik-baik saja) :

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

Juga, seperti jawaban yang lain menyebutkan, Anda dapat menggunakan -deleteperintah untuk menemukan. Dalam hal ini, rm~fungsi Anda adalah:

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

Bahkan, Anda dapat membuat fungsi keren yang akan mengambil argumen, katakanlah --dry-run, yang hanya akan menampilkan 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.

Sesuaikan dan luaskan dengan kebutuhan Anda!

Catatan. Anda harus membuka terminal baru agar perubahan diterapkan.

gniourf_gniourf
sumber
Terima kasih! Ini bekerja dengan baik, dan dry run sangat membantu.
Vinayak Garg
2
find -type f -name '*~' -delete(senjata pilihan, selain git clean -dfx .)
lihat
2
Ini adalah solusi yang elegan, saya harus login hanya untuk memberi Anda alat peraga. Memberi +1 kepada Anda, teman baik saya!
CodeChimp
9

*~diperluas oleh shell sebelum ditugaskan ke alias Anda. Tugas yang 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 berada di sana, hapus berlebihan .(direktori saat ini tersirat jika tidak ada parameter yang diberikan) dan berhenti menyalahgunakan xargskarena -deleteopsi sudah ada.

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

The -lspilihan adalah opsional, tetapi menambahkan ia akan menampilkan file mana yang telah dihapus.

Lekensteyn
sumber
+1 Terima kasih! Tetapi di mana saya menambahkan fungsi ini?
Vinayak Garg
@VinayakGarg Anda dapat menambahkannya ke Anda .bash_aliasesjuga, tetapi saya biasanya memasukkannya langsung ke dalam .bashrc.
Lekensteyn