Bash Script para renomear ou remover pontuação (?!) E string em nomes de arquivos, subdiretórios e diretórios recursivamente no Ubuntu 16.04

Bash Script para renomear ou remover pontuação (?!) E string em nomes de arquivos, subdiretórios e diretórios recursivamente no Ubuntu 16.04

Sou novo no uso de scripts Bash, mas descobri algumas soluções que o utilizam para remover ou renomear o nome de arquivo de arquivos dentro de diretórios e subdiretórios no Ubuntu 16.04. Por exemplo, minha estrutura de arquivos é mostrada abaixo. Então, the FolderFruit,,,é o nome do arquivo dos nossos diretórios principais. SubFolderApple???. SubFolder!!!Kiwi e SubFolder_Food_Bananasão os nomes dos arquivos de nossos subdiretórios. ListAppleFood, ListKiwiFood, e ListBananasão o nome de arquivo de nossos arquivos individuais.

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

O objetivo é alterar os nomes dos arquivos acima para os mostrados abaixo, removendo qualquer pontuação (por exemplo, ? e !) e a string 'Food' que aparece entre esses nomes de arquivos.

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

Até agora, consegui fazer o script abaixo, mas não está funcionando. Portanto, gostaria de obter ajuda de qualquer usuário experiente de Bash ou Linux.

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

Responder1

Em vez de usar um loop for, você poderia findusar -execdir:

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

Se eu detalhasse o comentário, renomear não faz distinção entre arquivos e diretórios, o que torna exponencialmente mais difícil (preservar o .ext). Nesse caso, acredito que seja melhor dividir o processo em duas etapas e processar arquivos e diretórios separadamente.

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

Os dois comandos fazem basicamente a mesma coisa, exceto que o segundo pode lidar com pontos.

informação relacionada