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? mv
sepertinya 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?
vidir
adalah solusi sederhana untuk masalah seperti ini.Jawaban:
Penyelesaian tab Bash harus dapat melakukan hal yang benar di sini jika Anda cukup mengetik
mv 90843_O
dan tekan tab. Jika tidak, salah satu cara untuk menghindari nama tersebut adalah: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: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:Ini
-i
akan membuatmv
prompt jika ada file yang akan ditimpa. Menggunakanprename
(rename
tautan ke ini di banyak sistem):Hapus
-n
ketika 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).sumber
Anda dapat menggunakan
rename
untuk tugas-tugas tersebut:Jika Anda ingin mengganti
'
untuk_
Anda juga dapat menggunakan rename:sumber
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-v
adalah 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 file
akan berganti nama-file
menjadifile
. Dalam kasus seperti ini Anda tidak dapat mengutip atau menghindari nama file, sebagai pengecualian.Anehnya, saya bisa membuat file
90843_O'ConnorPaul_GeneralManager.jpg
jika 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.
sumber