Saya perlu perintah untuk mengganti nama semua file di direktori saat ini bekerja, dengan cara yang nama file baru akan sama dengan yang lama, tetapi termasuk akhiran yang sesuai dengan jumlah baris dari file asli (misalnya jika file tersebut f
memiliki 10 baris maka harus diubah namanya menjadi f_10
).
Inilah upaya saya (tidak bekerja):
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Martin Yeboah
sumber
sumber
Jawaban:
Bagaimana tentang:
Sebagai contoh:
Jika Anda ingin menyimpan ekstensi (jika ada), gunakan ini sebagai gantinya:
sumber
_
. Adapun naskahnya, naskah apa? Itu harus dijalankan dari baris perintah, tidak perlu skrip. Jika Anda hanya ingin mencocokkan beberapa file, ubahin *
to, misalnya,in *txt
atau sesuatu.wc -l < $f
bukannya grep akan lebih mudah untuk dipahami (dan mungkin lebih baik untuk melakukan tetapi saya belum memeriksanya).wc
, saya ingin menunjukkan pendekatan yang berbeda. Tapi OK, cukup adil.Anda dapat mencoba liner yang satu ini:
Ini akan menemukan semua file di direktori kerja saat ini (
find . -maxdepth 1 -type f
)Kemudian kami menjalankan contoh shell di atas file yang ditemukan untuk mengubah nama file untuk menambahkan jumlah baris.
Contoh:
sumber
Cara lain yang mempertahankan ekstensi (jika ada) menggunakan
rename
:Jika hasilnya yang diharapkan, hapus
-n
opsi:sumber
rename
hebat =) +1(\.?[^\.]+)
.(\.?[^\.]+)
tidak ok juga karena akan cocok hanya sampai titik kedua dan tidak akan cocok dengan nama file dengan titik-titik berturut-turut atau berakhir dengan titik terlepas. Ini bukan solusi mudah yang sulit, satu-satunya cara tampaknya melakukan dua pergantian..
di dalam kelas karakter.Menggunakan
find
:Contoh
sumber
-name "*"
? Sisa dari tes? ;)Hanya untuk bersenang-senang dan tertawa dengan solusi
rename
. Karenarename
merupakan alat Perl yang menerima string arbitrer yang dievaluasi, Anda dapat melakukan segala macam kejahatan. Solusi yang tampaknya berhasil adalah sebagai berikut:sumber
Script di bawah ini mencakup banyak kasus: titik tunggal dan ekstensi (file.txt), banyak titik dan ekstensi (file.1.txt), titik-titik berturut-turut (file..foobar.txt), dan titik-titik dalam nama file (file. Atau mengajukan..).
Naskah
Script sedang beraksi
Perhatikan bahwa tidak ada baris dalam file. dan file .., maka jumlah baris adalah 0
Terima kasih khusus kepada terdon dan Helio untuk meninjau naskah dan pengeditan yang disarankan
sumber
Cara lain bash, dikembangkan dengan @Helio dalam obrolan :
Pria bermata satu yang terlihat aneh dengan kepala kedua yang terhambat (
(.*)(\.[^.]+)$
) harus cocok dengan ekstensi yang tepat (.foo
, bukan..
). Jika tidak ada ekstensi, makaBASH_REMATCH
array akan kosong. Kita dapat memanfaatkan ini dengan menggunakan nilai default untuk nama file${BASH_REMATCH[1]:-$file}
, dan hanya menggunakan ekstensi apa adanya.Untuk menangani file dot, Anda bisa menggunakan
find
, seperti yang disarankan oleh terdon dan Helio .sumber