Mengganti nama file yang mendapat tanda kutip 'dalam namanya

11

Saya punya sedikit masalah. Satu klien menugaskan saya dengan migrasi situs dari server yang benar-benar tua. Tidak tahu bagaimana mereka sampai di sana, tetapi ada file dengan 'nama mereka. Apakah ada cara untuk mengganti nama file? mvsepertinya tidak melakukan trik.

ls menunjukkannya sebagai 90843_O\\'ConnorPaul_GeneralManager.jpg

Ketika saya mencoba

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

tidak melakukan apa-apa dengan >di baris baru seolah-olah menunggu lebih banyak input.

Jika saya mencoba

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

Saya mendapatkan kesalahan

mv: tidak bisa stat '90843_O \' ConnorPaul_GeneralManager.jpg ': Tidak ada file atau direktori seperti itu

Juga, adakah cara sederhana untuk mengubah \'ke _dalam semua file di folder tertentu?

Igor Yavych
sumber
1
Jika Anda memiliki lebih banyak util , ini vidiradalah solusi sederhana untuk masalah seperti ini.
derobert

Jawaban:

6

Penyelesaian tab Bash harus dapat melakukan hal yang benar di sini jika Anda cukup mengetik mv 90843_Odan tekan tab. Jika tidak, salah satu cara untuk menghindari nama tersebut adalah:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

Kutipan ganda menghilangkan kebutuhan untuk melarikan diri ', tetapi dua karakter backslash masih perlu diloloskan (satu backslash tambahan untuk masing-masing membuat empat backslash). Pilihan lain adalah:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

Di sini menempatkan tanda garis miring terbalik dalam tanda kutip tunggal menghilangkan kebutuhan untuk melarikan diri dari tanda kutip, tetapi Anda harus mengakhiri tanda kutip tunggal untuk menambahkan literal '. Ini lolos setelah tanda kutip berakhir.

Catatan masalah di sini adalah banyak berkaitan dengan memiliki garis miring terbalik dalam nama sebagai kutipan tunggal. Untuk mengganti \\'urutan (karena ada dua garis miring terbalik dalam nama file dalam pertanyaan, keduanya akan menyebabkan masalah) dengan garis bawah untuk semua file dalam direktori menggunakan loop:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

Ini -iakan membuat mvprompt jika ada file yang akan ditimpa. Menggunakan prename( renametautan ke ini di banyak sistem):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Hapus -nketika Anda senang itu melakukan apa yang Anda inginkan. Perhatikan bahwa karakter garis miring terbalik harus dilepaskan di dalam ekspresi perl di sini, meskipun ada tanda kutip tunggal di sekitar mereka (tanpa tanda kutip tunggal Anda akan membutuhkan delapan garis miring terbalik karena empat akan dihapus oleh shell dan bukan menjadi bagian dari ekspresi perl).

Graeme
sumber
4

Anda dapat menggunakan renameuntuk tugas-tugas tersebut:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Jika Anda ingin mengganti 'untuk _Anda juga dapat menggunakan rename:

rename "s/\'/_/g" *
Braiam
sumber
-2

Grrr, @Graeme mengalahkan saya untuk itu, tapi saya akan tetap memposting ...

Jika Anda mengutip nama file dengan tanda kutip ganda, seperti mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg, itu berhasil; menggunakan -vadalah opsional tetapi akan memberi tahu apa yang dilakukannya. Saya percaya ada cara kedua yang terpisah dari melarikan diri dari semua karakter, -jika itu mungkin terjadi. Satu-satunya downside saya tahu cara ini adalah bahwa shell akan memproses teks karena tidak ada di dalam tanda kutip tunggal, tetapi itu tidak memanipulasinya sama sekali karena itu bukan kode internal, dan waktu ekstra yang diperlukan untuk memproses tidak ada artinya.

Baru saja diuji, Anda dapat memiliki char seperti >dalam teks yang dikutip ganda dan itu akan diambil sebagai bagian dari nama file.

Sebagai tip untuk masa depan, Anda dapat menggunakan ./tepat sebelum nama file jika memberikan masalah, seperti file yang dimulai dengan tanda hubung: mv ./-file fileakan berganti nama -filemenjadi file. Dalam kasus seperti ini Anda tidak dapat mengutip atau menghindari nama file, sebagai pengecualian.

Anehnya, saya bisa membuat file 90843_O'ConnorPaul_GeneralManager.jpgjika saya lolos dari kutipan tunggal oleh \', tetapi itu tidak akan membuatnya jika itu tidak dikutip atau melarikan diri.

NB: Selesainya Bash adalah cara lain, ia bekerja di sekitar masalah nama file dengan file Anda, tetapi itu tidak akan bekerja dengan "dash" file / folder: cukup tulis bagian dari nama dan tekan Tab, ia melakukan sisanya.

rautamiekka
sumber
Mengapa downvote? Saya menulis sebelum yang lain tetapi saya tidak cukup cepat untuk mempostingnya terlebih dahulu.
rautamiekka
Bukan saya. Tidak ada petunjuk siapa yang memilih.
Igor Yavych
1
Jawaban ini tidak benar, ia mengabaikan garis miring terbalik pada nama file yang sebenarnya lebih sulit untuk ditangani daripada kutipan tunggal.
Graeme