Вам не нужно разобрать вывод find
:
find . -depth -name '*:2f*' -execdir bash -c 'echo mv "$0" "${0//:2f/-}"' {} \;
Мы используем -execdir
так, что команда выполняется из каталога, содержащего найденный файл. Мы также используем -depth
, чтобы содержимое каталога рассматривалось перед самим каталогом. Все это, чтобы избежать проблем, если строка :2f
появляется в имени каталога.
Как есть, эта команда безвредна и не будет выполнять никакого переименования; он будет показывать только на терминале, что будет сделано. Удалите echo
, если вы довольны тем, что видите.
Предполагается, что вы хотите выполнить переименование для всех файлов и папок (рекурсивно) в текущем каталоге.
-execdir
может быть недоступен для вашей версии find
.
Если ваш find
не поддерживает -execdir
, вы можете обойтись без, как так:
find . -depth -name '*:2f*' -exec bash -c 'dn=${0%/*} bn=${0##*/}; echo mv "$dn/$bn" "$dn/${bn//:2f/-}"' {} \;
Здесь хитрость заключается в том, чтобы отделить часть каталога от имени файла часть-это то, что мы храним в dn
(dirname) и bn
(basename), а затем только изменить значение :2f
в имени файла.
'for' не перекрывает строки с нулевым символом. –
Почему вы используете '-prune' здесь? вы не хотите переименовывать скрытые файлы/каталоги? или просто пропустить '.'? –
Я просто хочу пропустить скрытые файлы и директории. – HTF