Заменить спецсимволы рекурсивно bash - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь найти все файлы и папки в определенной папке и всех подпапках и заменить все специальные символы. Все пробелы следует заменить точками, а все остальное просто удалить. Я пробовал несколько разных способов, но когда я использую «mv», кажется, что он не сохраняет структуру каталогов, а когда я использую «переименовать» вместе с «найти», он не хочет идти рекурсивно.

Самое близкое, что я получил, это:

for f in **/; do mv "$f" `echo $f | tr " " . | tr -dc '[:alnum:].'`; done

Но я думаю, что цикл где-то прерывается, так как он складывает имена файлов вместе и помещает результат в родительский каталог.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете сделать:

find . -depth -execdir rename 's/\s/./g; s/[^[:alnum:]./]//g' {} +

Пара моментов здесь:

  • -depth - сначала пройти по иерархии каталогов. Это обеспечивает переименование файлов в папке до переименования папки
  • -execdir - выполняет команду в подкаталоге - {} теперь будет ./filename вместо ./dir1/dir2/filename
  • это Perl-ароматизированный rename, проверьте вашу справочную страницу.
...