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_Banana
são os nomes dos arquivos de nossos subdiretórios. ListAppleFood
, ListKiwiFood
, e ListBanana
sã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 find
usar -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.