Bash Script para cambiar el nombre o eliminar la puntuación (?!) Y la cadena en los nombres de archivos, subdirectorios y directorios de forma recursiva en Ubuntu 16.04

Bash Script para cambiar el nombre o eliminar la puntuación (?!) Y la cadena en los nombres de archivos, subdirectorios y directorios de forma recursiva en Ubuntu 16.04

Soy nuevo en el uso de secuencias de comandos Bash, pero descubrí algunas soluciones que las usan para eliminar o cambiar el nombre de los archivos dentro de directorios y subdirectorios en Ubuntu 16.04. Por ejemplo, mi estructura de archivos se muestra a continuación. Entonces, FolderFruit,,,es el nombre de archivo de nuestros directorios principales. SubFolderApple???. SubFolder!!!Kiwi y SubFolder_Food_Bananason los nombres de archivos de nuestros subdirectorios. ListAppleFood, ListKiwiFoody ListBananason el nombre de archivo de nuestros archivos individuales.

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

El objetivo es cambiar los nombres de archivos anteriores a los que se muestran a continuación eliminando cualquier puntuación (por ejemplo, ? y !) y la cadena 'Comida' que aparecen entre esos nombres de archivos.

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

Hasta ahora, logro escribirlo como se muestra a continuación, pero no funciona. Por lo tanto, me gustaría recibir ayuda de cualquier usuario experimentado de Bash o Linux.

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

Respuesta1

En lugar de usar un bucle for, podrías usar findcon -execdir:

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

Si quisiera ampliar el comentario, cambiar el nombre no hace ninguna distinción entre archivos y directorios, lo que lo hace exponencialmente más difícil (preservar el .ext). En este caso, creo que es mejor dividir el proceso en dos pasos y procesar archivos y directorios por separado.

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

Los dos comandos hacen básicamente lo mismo excepto que el segundo puede manejar puntos.

información relacionada