Adında bir teklif işareti bulunan dosyayı yeniden adlandırma


11

Biraz sorunum var. Bir müşteri bana sitelerin gerçekten eski bir sunucudan taşınmasıyla görev verdi. Oraya nasıl geldiklerini bilmiyorum, ama dosyalar var' isimlerinde . Dosyayı yeniden adlandırmanın bir yolu var mı? mvhile yapmıyor gibi görünüyor.

ls olarak gösterir 90843_O\\'ConnorPaul_GeneralManager.jpg

Denediğimde

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

ile hiçbir şey yapmaz >yeni satırdaki ile daha fazla girdi bekliyormuş gibi bir .

Eğer denersem

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

Hatayı alıyorum

mv: can't stat '90843_O \' ConnorPaul_GeneralManager.jpg ': Böyle bir dosya veya dizin yok

Ayrıca, değiştirmek için basit bir yol var \'için _belli klasördeki tüm dosyaları?


1
Eğer varsa moreutils , onun vidirbu tür sorunlar üzerinde basit bir çözümdür.
derobert

Yanıtlar:


6

Sadece sekme yazıp mv 90843_Obasarsanız Bash sekmesi tamamlama burada doğru olanı yapabilmelidir . Aksi takdirde, addan düzgün bir şekilde kaçmanın bir yolu:

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

Çift tırnak işaretleri, kaçma ihtiyacını ortadan kaldırır ', ancak iki ters eğik çizgi karakterinin hala kaçması gerekir (her biri için bir ekstra ters eğik çizgi dört ters eğik çizgi yapar). Başka bir seçenek:

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

Burada ters eğik çizgileri tek tırnak içine almak, onlardan kaçma ihtiyacını ortadan kaldırır, ancak bir değişmez kelime eklemek için tek tırnak işaretlerini sonlandırmanız gerekir '. Bu, tırnak işareti bittikten sonra kaçar.

Buradaki sorunun, tek tırnak gibi adında ters eğik çizgiler olmasıyla ilgili olduğunu unutmayın. \\'Diziyi döngüdeki bir dizindeki tüm dosyalar için alt çizgi ile değiştirmek için (soruda dosya adında iki ters eğik çizgi bulunduğundan, her ikisi de soruna neden olur):

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

-iYapacak mvbütün dosyalar üzerine yazılır olacaksa istemi. Kullanarak prename( renamebirçok sistemde buna bağlantılar):

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

-nNe zaman mutlu istediğinizi çıkarın . Etrafında tek tırnak olsa bile, ters eğik çizgi karakterlerinin burada perl ifadesinin içine kaçması gerektiğini unutmayın (tek tırnak olmadan, dört kabuk tarafından kaldırılacak ve perl ifadesinin parçası olmayacağı için sekiz ters eğik çizgiye ihtiyacınız olacaktır).


4

Bu renametür görevler için kullanabilirsiniz :

➜  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

Eğer değiştirmek istiyorsanız 'için _de yeniden adlandırma kullanabilirsiniz:

rename "s/\'/_/g" *

-2

Grrr, @Graeme beni dövdü, ama yine de göndereceğim ...

Eğer dosya ismini çift tırnak işareti gibi kullanırsanız mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg, hile yapar; kullanma -visteğe bağlıdır, ancak ne yaptığını söyler. İnanıyorum ki tüm karakterlerden kaçmanın ikinci bir yolu daha var, eğer mümkünse. Bu şekilde bildiğim tek dezavantajı, kabuğun tek tırnak içinde olmadığı için metni işleyeceğidir, ancak iç kod olmadığı için işlemez ve işlemek için fazladan zaman anlamsızdır.

Sadece test edildi, >çift ​​tırnaklı bir metin içinde olduğu gibi bir karaktere sahip olabilirsiniz ve dosya adının bir parçası olarak alınacaktır.

Gelecek için bir ipucu olarak kullanabileceğiniz ./bir çizgi ile başlayan dosyaları gibi sorunları verirse dosya önce sağ: mv ./-file fileyeniden adlandırır -fileiçinfile . Bu durumda, istisna olarak dosya adından alıntı yapamaz veya kaçamazsınız.

İşin tuhafı 90843_O'ConnorPaul_GeneralManager.jpg, tek alıntıdan kaçarsam dosyayı oluşturabilirim \', ancak çift tırnaklı veya kaçmamış olsaydı oluşturmazdı.

Not: Bash tamamlama başka bir yoludur, dosyanızla ilgili dosya adı sorunu etrafında çalıştı, ancak "tire" dosyaları / klasörleri ile çalışmaz: sadece adın bir kısmını yazın ve Sekme tuşuna basın, gerisini yapar.


Neden oy kullanmıyorsunuz? Ben diğerlerinden önce yazıyordum ama önce yayınlanması için yeterince hızlı değildi.
rautamiekka

Ben değildim. Kimin oy verdiğine dair hiçbir ipucu yok.
Igor Yavych

1
Bu cevap doğru değil, dosya adındaki tek tırnaktan daha zor olan eğik çizgileri yok sayar.
Graeme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.