Zmiana nazwy pliku, który ma znak cudzysłowu w nazwie

11

Mam trochę problemu. Jeden klient zlecił mi migrację witryn z naprawdę starego serwera. Nie wiem, jak się tam dostali, ale 'w ich nazwach są pliki . Czy jest jakiś sposób na zmianę nazwy pliku? mvnie wydaje się, aby załatwić sprawę.

ls pokazuje to jako 90843_O\\'ConnorPaul_GeneralManager.jpg

Kiedy próbuję

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

nie robi nic z >nowym wierszem, jakby czekał na więcej danych wejściowych.

Jeśli spróbuję

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

Dostaję błąd

mv: nie można stat '90843_O \' ConnorPaul_GeneralManager.jpg ': Brak takiego pliku lub katalogu

Ponadto, istnieje prosty sposób na zmianę \'do _wszystkich plików w określonym folderze?

Igor Yavych
źródło
1
Jeśli masz moreutils , vidirjest to proste rozwiązanie tego rodzaju problemów.
derobert

Odpowiedzi:

6

Uzupełnianie zakładki Bash powinno być w stanie zrobić tutaj właściwą rzecz, jeśli tylko wpiszesz mv 90843_Oi wciśniesz tab. W przeciwnym razie jednym ze sposobów prawidłowej zmiany nazwy jest:

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

Podwójne cudzysłowy eliminują potrzebę ucieczki ', ale dwa znaki odwrotnego ukośnika wciąż muszą być poprzedzone (jeden dodatkowy odwrotny ukośnik dla każdego tworzy cztery odwrotne ukośniki). Inną opcją jest:

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

Umieszczenie odwrotnych ukośników w pojedynczych cudzysłowach eliminuje potrzebę ucieczki od nich, ale musisz zakończyć pojedyncze cudzysłowy, aby dodać literał '. Jest to unikane po zakończeniu cytowań.

Zauważ, że problem tutaj dotyczy tyle samo odwrotnych ukośników w nazwie, co pojedynczy cytat. Aby zastąpić \\'sekwencję (ponieważ w pytaniu są dwa ukośniki odwrotne, oba spowodują problemy) ze znakiem podkreślenia dla wszystkich plików w katalogu za pomocą pętli:

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

Wyświetli -isię mvmonit, jeśli jakieś pliki zostaną zastąpione. Za pomocą prename( renamełącza do tego w wielu systemach):

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

Usuń, -ngdy jesteś szczęśliwy, że robi to, co chcesz. Zauważ, że znaki odwrotnego ukośnika powinny być poprzedzone znakami w wyrażeniu perl, nawet jeśli wokół nich znajdują się pojedyncze cudzysłowy (bez pojedynczych cudzysłowów potrzebowałbyś ośmiu odwrotnych ukośników, ponieważ cztery zostałyby usunięte przez powłokę i nie byłyby częścią wyrażenia perla).

Graeme
źródło
4

Możesz użyć renamedo takich zadań:

➜  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

Jeśli chcesz zamienić 'na _można również użyć Zmień nazwę:

rename "s/\'/_/g" *
Braiam
źródło
-2

Grrr, @Graeme pobił mnie, ale i tak opublikuję ...

Jeśli podasz nazwę pliku z podwójnymi cudzysłowami, na przykład mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg, to załatwi sprawę; użycie -vjest opcjonalne, ale pokaże, co zrobiło. Uważam, że istnieje druga droga oprócz ucieczki od wszystkich znaków, jeśli to możliwe. Jedynym minusem, jaki znam w ten sposób, jest to, że powłoka przetwarza tekst, ponieważ nie znajduje się on w pojedynczych cudzysłowach, ale w ogóle go nie manipuluje, ponieważ nie jest to wewnętrzny kod, a dodatkowy czas potrzebny na przetworzenie jest bez znaczenia.

Właśnie przetestowany, możesz mieć znak jak >w cudzysłowie i będzie on traktowany jako część nazwy pliku.

Jako wskazówkę na przyszłość, możesz użyć ./tuż przed nazwą pliku, jeśli powoduje to problemy, np. Pliki zaczynające się od myślnika: mv ./-file filezmieni nazwę -filena file. W takim przypadku nie można podać nazwy pliku ani uciec przed nim, jako wyjątek.

Dziwne, że mógłbym utworzyć plik, 90843_O'ConnorPaul_GeneralManager.jpggdybym uniknął pojedynczego cudzysłowu \', ale nie utworzyłby go, gdyby nie był on podwójnie cytowany ani nie został zastąpiony.

PS: Uzupełnianie Bash jest innym sposobem, działało wokół problemu z nazwą pliku w twoim pliku, ale nie działa z plikami / folderami „dash”: po prostu napisz część nazwy i wciśnij Tab, zrobi resztę.

rautamiekka
źródło
Dlaczego głosować? Pisałem przed innymi, ale nie byłem wystarczająco szybki, aby opublikować go jako pierwszy.
rautamiekka
Nie byłem ja Nie mam pojęcia, kto głosował.
Igor Yavych
1
Ta odpowiedź jest nieprawidłowa, ignoruje ukośniki odwrotne w nazwie pliku, które w rzeczywistości są trudniejsze do opanowania niż pojedynczy cytat.
Graeme