https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux
https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name
https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension
https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux
Wszystkie wymienione artykuły odpowiedziały na moje pytanie. Jednak żaden z nich nie działa dla mnie. Podejrzewam, że dzieje się tak, ponieważ ciąg, który próbuję zastąpić, zawiera #. Czy istnieje specjalny sposób rozwiązania tego problemu?
Mam plik obrazu, który został zastąpiony przez é # U00a9 podczas migracji witryny. Wyglądają tak:
Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg
i chcę to zmienić na coś takiego:
Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg
AKTUALIZACJA:
Wszystkie te przykłady zaczynają się od „LU00a9ucky, ale tutaj jest wiele obrazów o różnych nazwach. Po prostu celuję w część„ # U00a9 ”ciągu znaków, aby zastąpić ją„ bezpieczną ”.
rename
polecenia. Podejrzewam, że twoja zmiana nazwy byłaby tak prosta jakrename -n 's/#/safeNBC/' *.jpg
.rename -n 's/#U00a9/safe/' *.jpg
i polecenie zostało zaakceptowane, ale nie nastąpiły żadne zmiany.-n
jest tono act
opcja. Co pozwala zobaczyć, czy to działa, zanim faktycznie go użyjesz. Czy dane wyjściowe na ekranie poprawnie wyświetlały potencjalne nowe nazwy?Odpowiedzi:
Aby zastąpić
#
przezsomethingelse
nazw plików w bieżącym katalogu (nie rekurencyjnego) można użyć GNU zmiany nazwy narzędzia:Znaki takie
-
muszą być poprzedzone znakiem ucieczki\
.W twoim przypadku chciałbyś użyć
Zauważ, że jeśli chcesz operować tylko na pewnym zaznaczeniu plików, np. Tylko
*.jpg
, dostosuj końcowe dane wejściowe, aby pasowały do tego wyboru:Aby wykonać test przed faktyczną zmianą nazw plików, użyj
-n
flagi:Dla OS X, GNU zmiany nazwy można zainstalować przy użyciu homebrew :
brew install rename
.źródło
rename
używasz?# sudo pacman -S perl-rename
zainstaluje wersję Perla, która jest potężniejsza i może wystarczyć, aby ta odpowiedź działała dla Ciebie.rename --version
zwraca,rename from util-linux 2.29.2
więc to naprawdę nie jest wersja perla.rename
narzędzia, ale żadne z nich nie jest rozwijane przez GNU: dystrybucje oparte na Debianie zawierająrename
narzędzie wraz z pakietem Perla, podczas gdy dystrybucje oparte na Red Hat korzystają zrename
narzędzia zutil-linux
Linux Kernel Organization. Twój link prowadzi do funkcjirename
C ze standardowej biblioteki GNU./g
wrename 's/#U00a9/safe/g' *
znajdź listę plików, a następnie zastąp słowo kluczowe. poniżej jest przykład
źródło
mv
argumentów, na wypadek, gdyby w nazwie były spacjeNie jest to trudne, po prostu pamiętaj, aby uciec przed nazwą oktotorpe (#), przygotowując odwrotny ukośnik (\).
źródło
#
dźwięków, których potrzebuję. Nie widzę odwrotnego ukośnika w twoim przykładzie. Czy powinno to wyglądać tak:s/\#U00a9/safe/
Aby uciec
#
z powłoki, użyj pojedynczych cudzysłowów ('#'
), podwójnych cudzysłowów ("#"
) lub odwrotnego ukośnika (\#
).Najprostszym w twoim przypadku byłoby użycie
rename
polecenia (jeśli jest dostępne):źródło
rename 's/#/somethingelse/' *
) nie działała na moim komputerze (Arch Linux), ta właśnie działała.nie wiem jak to zrobić, ale możesz spróbować tego w powłoce bash:
wyjaśnienie:
Więcej informacji na temat zastępowania parametrów (co jest wysoce niewykorzystanym IMO): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
źródło
Powyższe przykłady nie działały w moim systemie (CentOS 5.6), więc znalazłem (prawdopodobnie bardziej specyficzne dla systemu) polecenie, które działa (uwaga: trzeba uciec z '#' z
\
linii poleceń):rename \#U00a9 safe *.jpg
[Również: Nie mam jeszcze wystarczającej reputacji, aby móc komentować, więc w odpowiedzi na pytanie Nikhila dotyczące użycia
/g
inrename 's/old_string/new_string/g'
(zamieszczone w komentarzach do innej odpowiedzi powyżej):Użyj
g
modyfikatora, aby wykonać podstawienie „globalne” (to znaczy zastąpić new_string old_string tyle razy, ile wystąpi old_string). Nie powinno to być konieczne w mojej odpowiedzi, ponieważrename
zostanie zastosowane do wszystkich plików określonych za pomocą*
. Zobacz https://www.computerhope.com/unix/rename.htm, aby uzyskać zwięzłe wyjaśnienie tego i innych modyfikatorów.]źródło
rename
niż systemy operacyjne oparte na Debianie. Zobacz unix.stackexchange.com/a/238862/135943 . Nawiasem mówiąc, CentOS 5.6 jest dość stary i polecam aktualizację.Oto rozwiązanie DTK opakowane w funkcję bash wielokrotnego użytku:
Oto jak możesz go użyć:
źródło
W rzeczywistości
rename
ma opcję dokładnie dla tego zwanego--subst
lub-s
w skrócie. Nie trzeba używać składni wyrażenia regularnego.Jeśli chcesz zastąpić / zastąpić wiele wystąpień, użyj
--subst-all
lub-S
.BTW, chciałem tylko zamienić ciąg znaków na nic (usunąć go z nazwy pliku) ... cóż, mamy również opcję
-d/--delete
i-D/--delete-all
:źródło
Inną opcją jest użycie
pyRenamer
aplikacji stworzonej specjalnie do zmiany nazwy partii.Można go zainstalować za pomocą
sudo apt-get install pyrenamer
Szczegółowe informacje na temat użytkowania znajdują się w pliku README w serwisie GitHub .
źródło