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? mv
nie 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?
vidir
jest to proste rozwiązanie tego rodzaju problemów.Odpowiedzi:
Uzupełnianie zakładki Bash powinno być w stanie zrobić tutaj właściwą rzecz, jeśli tylko wpiszesz
mv 90843_O
i wciśniesz tab. W przeciwnym razie jednym ze sposobów prawidłowej zmiany nazwy jest: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: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:Wyświetli
-i
sięmv
monit, jeśli jakieś pliki zostaną zastąpione. Za pomocąprename
(rename
łącza do tego w wielu systemach):Usuń,
-n
gdy 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).źródło
Możesz użyć
rename
do takich zadań:Jeśli chcesz zamienić
'
na_
można również użyć Zmień nazwę:źródło
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-v
jest 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 file
zmieni nazwę-file
nafile
. 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.jpg
gdybym 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ę.
źródło