Bagaimana cara mengganti nama semua file dalam direktori, secara rekursif, mengubah satu ekstensi file ke yang lain, untuk ribuan file dalam ribuan subfolder? Saya melihat banyak perintah yang melakukan hampir apa yang saya inginkan, tetapi tidak cukup.
find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."
...
rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile
linux
command-line
file-management
rename
endolith
sumber
sumber
rename
atau Red Hatrename
?Jawaban:
Menemukannya
tentu saja menghapus -v ketika benar-benar melakukannya, atau itu akan membuang waktu untuk menampilkan semua file
sumber
Sesuatu seperti:
sumber
Dengan zsh:
Hapus
-n
untuk benar-benar melakukan penggantian nama.sumber
Saya menemukan metode ini lebih mudah dan lebih mudah dibaca:
Setidaknya pada derivasi Ubuntu rename mengambil daftar file dari STDIN jika tidak ada yang ada di baris perintah. Dan ini dapat diuji dengan mudah dengan:
sampai Anda melakukannya dengan benar.
sumber
Ganti nama file dan direktori dengan
find -execdir | rename
Jika Anda akan mengubah nama file dan direktori tidak hanya dengan akhiran, maka ini adalah pola yang baik:
-execdir
Opsi yang luar biasa melakukan acd
ke direktori sebelum mengeksekusirename
perintah, tidak seperti-exec
.-depth
memastikan bahwa penggantian nama terjadi pertama kali pada anak-anak, dan kemudian pada orang tua, untuk mencegah kemungkinan masalah dengan direktori orang tua yang hilang.-execdir
diperlukan karena penggantian nama tidak berfungsi dengan baik dengan jalur input non-basename, misalnya yang gagal:The
PATH
hacking diperlukan karena-execdir
memiliki satu kelemahan yang sangat mengganggu:find
yang sangat dogmatis dan menolak untuk melakukan apa saja dengan-execdir
jika Anda memiliki path relatif di AndaPATH
variabel lingkungan, misalnya./node_modules/.bin
, gagal dengan:Lihat juga: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-in-the-path/1109378#1109378
-execdir
adalah ekstensi menemukan GNU ke POSIX .rename
berbasis Perl dan berasal darirename
paket. Diuji di Ubuntu 18.10.Ganti nama lookahead workaround
Jika jalur input Anda tidak berasal
find
, atau jika Anda sudah cukup mengalami gangguan jalur relatif, kita dapat menggunakan beberapa Perl lookahead untuk mengganti nama direktori dengan aman seperti di:Saya belum menemukan analog yang cocok untuk
-execdir
denganxargs
: Xargs: ubah direktori kerja ke path file sebelum dieksekusi?The
sort -r
diperlukan untuk memastikan bahwa file datang setelah direktori masing-masing, karena jalur lagi datang setelah yang lebih pendek dengan awalan yang sama.sumber