2016-08-19 2 views
1

Как заменить часть имени файла определенного типа (.zip) другой строкой, рекурсивно через все потенциальные вложенные подкаталоги?Как заменить часть имени файла рекурсивно в терминале/.zsh?

Это моя файловая структура:

dir/ 
    | 
    subdir/ 
    | 
    filename_strToReplace.zip 
    | 
    subdir/ 
     | 
     subdir 
       | 
       filename_strToReplace.zip 
       filename_strToReplace.zip 
       filename_strToReplace.zip 

Так как вы можете видеть, файлы, чьи имена файлов должны быть modiffied могут быть вложены несколько уровней в глубину. У меня есть некоторый опыт работы с терминалом и оболочкой, но не реальный сценарий.

Я считаю, что решение представляет собой комбинацию mv, RegEx (которую я могу использовать довольно прилично) и цикл for.

Для чего это стоит, я нахожусь на Mac, используя «по умолчанию» терминал (не испортил это) с помощью Oh-my-zshell.

Спасибо!

+0

Если вы используете zsh, почему тег bash? – sjsam

+1

Прошу прощения, но, честно говоря, я совершенно новичок в консоли, поэтому я должен вводить в заблуждение терминал, терминальную программу, оболочку и, возможно, другую базовую терминологию (Off topic: если у вас есть хороший стартовый учебник по этим вопросам, пожалуйста, дайте мне знать.) –

ответ

1

Использование find и rename команды вы можете добиться того, что:

find . -name '*strToReplace*' | xargs -I{} rename 's/strToReplace/replacement/' {} 

найти поиска все файлы, имя которых содержит strToReplace. Затем rename использует regex для переименования этих файлов.

+0

Эй, я получил это: '~> xargs: rename: Нет такого файла или каталога' –

+1

Возможно, вам придется его установить, возможно, используя Homebrew –

+0

Это излишний для' zsh'. – chepner

0

В bash вы могли бы достичь этого, используя find + пользовательскую функцию

#!/bin/bash 
function namereplacer() 
{ 
for file in "[email protected]" 
do 
mv "$file" "${file/%stringToReplace.zip/newstring.zip}" 
done 

} 
export -f namereplacer 
find /base/path/ -depth -type f -name "*stringToReplace.zip" \ 
-exec bash -c 'namereplacer "[email protected]"' _ {} + 
# The 'exec {} +' form builds the command line, see find man 

Примечание Заменить /base/path с пути к папке базы

0

Использование zmv:

Удалите -n, чтобы фактически выполнить переименование после проверки того, что команда будет делать то, что вы хотите.

Смежные вопросы