Я новичок в использовании скриптов 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 можно использовать find
with -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' {} \; \)
Обе команды выполняют по сути одно и то же действие, за исключением того, что вторая может обрабатывать точки.