Hapus karakter tertentu dari banyak file dengan whitepsaces

8

Saya mencoba mengubah nama banyak trek musik dalam direktori, tetapi saya mendapatkan kesalahan ini:

Saat memindahkan banyak file, argumen terakhir harus berupa direktori

Ini skripnya:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Ini berfungsi untuk file tanpa spasi, bagaimana saya akan memodifikasi skrip ini?

Casper
sumber

Jawaban:

14

Gunakan kutipan:

mv -- "$file" "$(echo "$file" | sed ...)"

Lain mvmelihat beberapa argumen. Nama file yang dipanggil file name with spacesakan menjadi 4 argumen untuk mv. Oleh karena itu kesalahan: when moving multiple files, last argument must be a directory. Ketika mvmemiliki lebih dari 2 argumen, dengan asumsi Anda ingin memindahkan beberapa file ke direktori (yang kemudian akan menjadi argumen terakhir).


Namun, sepertinya Anda ingin menghapus 5 karakter pertama dari nama file. Itu bisa dilakukan lebih sederhana dengan bash:

mv -- "$file" "${file:5}"

Sunting : Saya menambahkan --benderanya, terima kasih atas komentar @ pabouk . Sekarang file yang dimulai dengan tanda hubung -juga diproses dengan benar.

kekacauan
sumber
2
Itu mungkin tidak bekerja dengan nama file yang dimulai dengan -. Alih-alih echo "$file"digunakan printf '%s\n' "$file".
pabouk
Saya lupa tentang mv. :) Anda menangani kasus itu :) --- Yang saya maksud adalah masalah dengan echodirinya sendiri. Misalnya GNU echo (baik standalone dan bash built-in) tidak akan mencetak string ini: -n, -edan -E. Bahkan menurut definisi POSIX tidak dimungkinkan untuk digunakan secara echoandal karena situasi tertentu tidak ditentukan. Sesuai XSI echoakan menafsirkan urutan melarikan diri backslash. --- printf '%s\n'tidak memiliki efek tergantung yang tidak diinginkan dan implementasi seperti itu.
pabouk
3

Anda dapat menggunakan nama samaran, yang sering didistribusikan bersama dengan Perl. (Misalnya, di Debian, / usr / bin / nama file dipasang oleh perlpaket.) Jika tidak dikemas oleh distribusi Anda (cari prenamedan renamedi lokasi binari konvensional), tersedia untuk diunduh dari sejumlah tempat, seperti misalnya di sini , di sini atau di sini .

Script ini mengambil ekspresi reguler untuk diterapkan ke masing-masing nama file, dan satu set nama file, dan memodifikasi nama-nama file tersebut sesuai dengan ekspresi reguler itu.

Misalnya, Anda mungkin melakukannya

prename -v -n 's/^.{5}//' *

untuk menunjukkan apa yang akan terjadi jika Anda menghapus lima karakter pertama dalam nama file. Untuk benar - benar menjalankan rename, Anda cukup menghapus -n.

sebuah CVn
sumber