Saya memiliki direktori say /var/tmp/abc
yang memiliki 4 file:
12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
Saya ingin mengubah nama semua file CSV (temukan semua file & ganti nama) dengan cara sesingkat mungkin (mungkin satu-liner) untuk ini:
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv
rename
. Saya berasumsi ini adalah Larry Wall'srename
, darirename
paket di Debian dan turunannya (dan IIRCprename
pada sistem persuasi RedHat). Alat yang sangat berguna.perl-rename
di arch linuxverbose
flag, tidak menghasilkan apa-apa dan tidak melakukan perubahan nama file, meskipun jalur saat ini memiliki file dengan nama yang mirip dengan12345_foo.csv
. Apakah saya harus melakukan tugas tambahan untuk membuatnya berfungsi (saat ini di Fedora 30)? Ini adalah pendekatan yang lebih bersih daripada perulangan. Terima kasih sebelumnya!rename
atauprename
? Lihat komentar saya di atas.man {the command}
daftar penulis di bagian akhir.rename
perintah yang sama sekali berbeda ; lihat unix.stackexchange.com/a/238862/135943Mencoba:
Bagaimana itu bekerja:
for f in *.csv; do
Ini memulai loop atas semua
*.csv
file.mv -i -- "$f" "XXXXX-${f#*-}"
Ini mengganti nama file seperti yang Anda inginkan, bertanya secara interaktif sebelum menimpa file apa pun.
done
Ini menandai akhir dari loop.
Contoh:
sumber
Saya menyukai tantangan kecil yang telah Anda posting, jadi inilah solusi saya. Saya mengasumsikan bahwa semua file Anda dimulai dengan 5 karakter numerik, jadi gunakan perintah cut untuk mengganti file angka awal dengan "XXXXX".
Di bawah ini, file sebelum perintah.
Di bawah ini, perintah one liner.
Di bawah, file setelah perintah.
Itukah yang kamu cari? :)
Referensi:
Looping melalui output perintah di bash
Substring dalam bash
sumber
no need to fork a new process for each
?cut
adalah biner terpisah (/usr/bin/cut
) dan menjalankannya menghabiskan lebih banyak sumber daya daripada menggunakan shell built in.tidak ada garpu:
Ketika Anda menggunakan loop shell,
mv
garpu sekali per file. Perlrename
Perintah tidak.(Perintah rename Perl memiliki beberapa batasan, tetapi dalam kasus khusus ini pembatasan tersebut tidak berlaku.)
Adapun
rename
perintah yang ditunjukkan sebelumnya, ya itu berhasil, tetapi kemudian Anda memiliki semua kebingungan antara dua jenis nama yang berbeda dan seterusnya. Jika Anda memiliki yang benar, bagus, tetapi jika tidak, ini juga berfungsi.Jika Anda tidak memiliki perintah perl-rename dan tidak dapat menginstalnya, Anda bisa melakukan ini:
Seperti yang Anda lihat, ini menggunakan substitusi yang sama seperti yang ditunjukkan pada jawaban teratas. Tentu saja perl-rename memiliki lonceng lainnya dan peluit (jawaban atas disebutkan,
-n
sudah, kemudian ada-0
,-f
dan sebagainya), dan lebih dari mereka yang Anda butuhkan, semakin Anda harus menginstal bahwa alih-alih rolling Anda sendiri dengan cara ini .sumber
rename
perintah ( jawaban atas , juga menggunakan Perl), jadi mungkin Anda harus menambahkan sedikit penjelasan lebih dari sekadar "tanpa garpu" untuk jawabannya.