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_Banana
son los nombres de archivos de nuestros subdirectorios. ListAppleFood
, ListKiwiFood
y ListBanana
son 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 find
con -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.