Как указывает @ams, многие рекурсивные решения для замены требуют, чтобы вы работали со всем путем, а не только с именем файла.
Я использую действие find -execdir для решения этой проблемы , Если вы используете -execdir вместо -exec, указанная команда запускается из подкаталога, содержащего сопоставленный файл. Таким образом, вместо передачи всего пути к rename он пропускает только ./filename. Это значительно упрощает запись команды replace.
find /the/path -type f \
-name '*_one.txt' \
-execdir rename 's/\.\/(.+)_one\.txt$/$1_two.txt/' {} \;
Подробнее:
-type f означает, что поиск файлов, а не каталогов -name '*_one.txt' означает означает только совпадение имен файлов это конец в _one.txt В этом ответе я использую команду rename вместо mv. rename использует регулярное выражение Perl для переименования каждого файла. Обратные косые черты после -type и -name являются символами продолжения строки bash. Я использую их, чтобы сделать этот пример более читабельным, но на практике они не нужны. Однако обратная косая черта в конце строки -execdir требуется. Здесь есть esacpe точка с запятой, которая завершает команду, выполняемую -execdir. Весело!Объяснение регулярного выражения:
-type f означает только поиск файлов, а не каталогов \.\/, совпадающих с ведущим ./, который -execdir проходит в Используйте \, чтобы избежать. и / metacharacters -name '*_one.txt' означает означает только совпадение имен файлов, заканчивающихся в _one.txt _one\.txt, совпадение «_one.txt», выход из метасимвола точки . В этом ответе я использую rename вместо mv. rename использует регулярное выражение Perl для переименования каждого файла. / отмечает конец части «соответствия» регулярного выражения и начало части «заменить» . Обратные косые черты после -type и -name - символ продолжения строки bash. Я использую их, чтобы сделать этот пример более читабельным, но на практике они не нужны. _two.txt имя нового файла закончится в «_two.txt». Не нужно избегать метасимвола точки здесь, в разделе «замена» Однако обратная косая черта в конце строки -execdir требуется. Здесь есть esacpe точка с запятой, которая завершает команду, выполняемую -execdir. Fun!До
tree --charset=ascii
|-- a_one.txt
|-- b_one.txt
|-- Not_this.txt
`-- dir1
`-- c_one.txt
После
tree --charset=ascii
|-- a_two.txt
|-- b_two.txt
|-- Not_this.txt
`-- dir1
`-- c_two.txt
Подсказка: rename - n. Он выполняет сухой запуск и показывает вам, какие имена он изменит, но не вносит никаких изменений.
Вместо запуска скрипта вы можете установить пакет sysfsutils
и добавить строку
kernel/debug/vgaswitcheroo/switch=OFF
в файл /etc/sysfs.conf