Скрипт Bash для рекурсивного переименования или удаления знаков препинания (? !) и строк в именах файлов, подкаталогов и каталогов в Ubuntu 16.04

Скрипт Bash для рекурсивного переименования или удаления знаков препинания (? !) и строк в именах файлов, подкаталогов и каталогов в Ubuntu 16.04

Я новичок в использовании скриптов Bash, но я обнаружил несколько решений, которые используют его для удаления или переименования имени файла для файлов в каталогах и подкаталогах в Ubuntu 16.04. Например, моя файловая структура показана ниже. Итак, это FolderFruit,,,имя файла наших основных каталогов. SubFolderApple???. SubFolder!!!Kiwi и SubFolder_Food_Bananaэто имена файлов наших подкаталогов. ListAppleFood, ListKiwiFood, и ListBananaэто имена файлов наших отдельных файлов.

>FolderFruit,,,
>>   SubFolderApple??
>>>      ListAppleFood.txt
>>   SubFolder!!Kiwi
>>>      ListKiwiFood.pdf
>>   SubFolder_Food_Banana
>>>      ListBanana.csv

Цель состоит в том, чтобы изменить имена файлов, указанные выше, на показанные ниже, удалив все знаки препинания (например, ? и !) и строку «Еда», которые встречаются среди этих имен файлов.

>FolderFruit
>>   SubFolderApple
>>>      ListApple.txt
>>   SubFolderKiwi
>>>      ListKiwi.pdf
>>   SubFolderBanana
>>>      ListBanana.csv

Пока что мне удалось написать скрипт, как показано ниже, но он не работает. Поэтому я хотел бы получить помощь от опытных пользователей Bash или Linux.

shopt -s globstar for f in ./**; do sed 's/\([[:punct:]]\)/\\\1/g' "$f" done

решение1

Вместо использования цикла for можно использовать findwith -execdir:

$ find -depth -mindepth 1 -type f,d -execdir \
  rename 's/((Sub)?Folder|Food|List|[_,!?])//g' {} \;

Если бы я хотел уточнить комментарий, rename не делает никаких различий между файлами и каталогами, что делает его экспоненциально более сложным (для сохранения .ext). В этом случае я считаю, что лучше разделить процесс на два этапа и обрабатывать файлы и каталоги отдельно.

$ find -mindepth 1 -depth \
   \( -type f -execdir rename 's/(List|Food|[[:punct:]])(?![^.]*$)//g' {} \; \) \
-o \( -type d -execdir rename 's/((Sub)?Folder|Food|[[:punct:]])//g' {} \; \)

Обе команды выполняют по сути одно и то же действие, за исключением того, что вторая может обрабатывать точки.

Связанный контент