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
Эти упомянутые статьи все ответили на мой вопрос. Однако ни один из них не работает для меня. Я подозреваю, что это потому, что строка, которую я пытаюсь заменить, содержит #. Есть ли особый способ решения этой проблемы?
У меня есть файл изображения, который заменил é на # U00a9 во время миграции сайта. Это выглядит так:
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
и я хочу изменить это на что-то вроде этого:
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
ОБНОВИТЬ:
Все эти примеры начинаются с "LU00a9ucky", но здесь много изображений с разными именами. Я просто нацеливаюсь на часть строки "# U00a9", чтобы заменить на "safe".
rename
команду. Я подозреваю, что ваше переименование будет так же просто, какrename -n 's/#/safeNBC/' *.jpg
.rename -n 's/#U00a9/safe/' *.jpg
и команда была принята, но никаких изменений не произошло.-n
этоno act
вариант. Что позволяет увидеть, работает ли оно до того, как вы его на самом деле используете. Правильно ли отображались выходные данные на экране?Ответы:
Для того, чтобы заменить
#
наsomethingelse
имена файлов в текущем каталоге (не рекурсивный) , вы можете использовать GNU переименования утилиты:Символы вроде
-
должны быть экранированы с\
.Для вашего случая вы хотели бы использовать
Обратите внимание, что если вы хотите работать только с определенным набором файлов, например, только
*.jpg
, настройте окончательный ввод в соответствии с этим выбором:Чтобы выполнить тест до фактического изменения имен файлов, используйте
-n
флаг:Для OS X, GNU переименование может быть установлено с помощью доморощенного :
brew install rename
.источник
rename
вы используете?# sudo pacman -S perl-rename
установит Perl-версию, которая является более мощной и может быть достаточной для того, чтобы этот ответ работал для вас.rename --version
возвращаетсяrename from util-linux 2.29.2
так, что это действительно не версия Perl.rename
утилиты, но ни одна из них не разработана GNU: дистрибутивы на основе Debian включаютrename
утилиту с пакетом Perl, а дистрибутивы на основе Red Hat используютrename
утилиту изutil-linux
организации ядра Linux. Ваша ссылка на функциюrename
C из стандартной библиотеки GNU./g
вrename 's/#U00a9/safe/g' *
найти список файлов, а затем заменить ключевое слово. ниже пример
источник
mv
аргументов, если в названии есть пробелыЭто не сложно, просто убедитесь, что экранирования (#) в имени не используется, добавив обратную косую черту (\).
источник
#
звуков, как то, что мне нужно. Я не вижу обратной косой черты в вашем примере. Должно ли это выглядеть так:s/\#U00a9/safe/
Чтобы выйти
#
из оболочки, просто используйте одинарные кавычки ('#'
), двойные кавычки ("#"
) или обратную косую черту (\#
).В вашем случае проще всего использовать
rename
команду (если она доступна):источник
rename 's/#/somethingelse/' *
) не работал на моей машине (Arch Linux), этот работал.не знаю, как в sed, но вы можете попробовать это в оболочке bash:
объяснение:
Подробнее о замене параметров (в которой ИМО используется недостаточно): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
источник
Приведенные выше примеры не работали в моей системе (CentOS 5.6), поэтому я обнаружил (возможно, более специфичную для системы) команду, которая работает (примечание: необходимо экранировать «#» с помощью
\
командной строки):rename \#U00a9 safe *.jpg
[Также: у меня недостаточно репутации, чтобы комментировать, поэтому в ответ на вопрос Нихила об использовании
/g
inrename 's/old_string/new_string/g'
(поставлено в комментариях для другого ответа выше):Используйте
g
модификатор для выполнения «глобальной» замены (то есть для замены new_string на old_string столько раз, сколько происходит old_string). Это не должно быть необходимо в моем ответе, потому чтоrename
он будет применен ко всем файлам, указанным в*
. См. Https://www.computerhope.com/unix/rename.htm для краткого объяснения этого и других модификаторов.]источник
rename
нежели производные от Debian. См. Unix.stackexchange.com/a/238862/135943 . И, кстати, CentOS 5.6 довольно старый, и я рекомендую вам обновить.Вот решение DTK, заключенное в многоразовую функцию bash:
Вот как вы можете использовать это:
источник
На самом деле
rename
есть опция именно для того, чтобы звонили--subst
или-s
короче. Нет необходимости использовать синтаксис регулярных выражений.Если вы хотите заменить / заменить несколько вхождений, используйте
--subst-all
или-S
.Кстати, я хотел только заменить строку ничем (удалить ее из имени файла) ... ну, у нас также есть возможность для этого
-d/--delete
и-D/--delete-all
:источник
Другим вариантом является использование
pyRenamer
приложения, созданного специально для пакетного переименования.Может быть установлен с
sudo apt-get install pyrenamer
Подробнее об использовании см. В файле README на GitHub .
источник