Estoy creando una secuencia de comandos que elimina archivos usando la configuración que contiene Carpeta y File_Prefix.
Este será el archivo de configuración:
config.txt
/local/FolderA,App /local/FolderB,Log /local/FolderC,File
Este es mi guión:
file="local/config.txt" while IFS="," read -r folder prefix; do find %s -name %s* -type f -exec rm {} \ "$folder" "$prefix"; done < "$file"
Sin embargo, no funciona correctamente. ¿Puedes ayudar en la resolución de problemas? Tengo problemas para asignar los valores del IFS
comando.
Respuesta1
Suponiendo que su archivo de configuración no contiene campos con nuevas líneas o comas incrustadas, y suponiendo que desea eliminar todos los archivos que tienen el prefijo de nombre de archivo mencionado solo en los directorios designados (es decir, no de forma recursiva):
#!/bin/sh
while IFS=, read -r directory prefix; do
rm -- "$directory/$prefix"*
done <config.txt
Esto lee el primer campo delimitado por comas en cada línea en la directory
variable y el resto de la línea en la prefix
variable. Luego los utiliza para eliminar los archivos. (Ver¿Dónde está documentado el argumento `--` (doble guión)?para una explicación sobre --
)
Si necesita realizar la eliminación de forma recursiva, debajo de cada ruta de directorio mencionada:
#!/bin/sh
while IFS=, read -r directory prefix; do
find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt
La diferencia entre estos dos, además de find
buscar de forma recursiva, es que $prefix
se utilizará como si fuera un patrón global en el find
comando.
Tenga en cuenta que *
debe citarse cuando se usa con find
para que el shell no lo expanda a nombres coincidentes en el directorio actual, y eso *
debería serno cotizadocuando se usa con rm
en el primer bucle anterior, para que el shell lo expanda a todos los nombres coincidentes.
Si ustednodesea realizar la eliminación de forma recursiva, pero tiene tantos archivos que coinciden con los patrones generados que el primer bucle le proporciona un error de "lista de argumentos demasiado larga", entonces es posible que desee realizar un bucle interno adicional.
#!/bin/sh
while IFS=, read -r directory prefix; do
for pathname in "$directory/$prefix"*; do
rm -- "$pathname"
done
done <config.txt
o uso find
restringido a la ruta de búsqueda de nivel superior,
#!/bin/sh
while IFS=, read -r directory prefix; do
find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt
Respuesta2
Usamos xargs para pasar rutas de archivos desde el archivo config.txt a un ejecutable sh en su línea de comando.
< config.txt xargs -rd'\n' sh -c '
for arg do
find "${arg%,*}" \
-name "${arg##*,}*" \
-type f \
-exec rm -f {} + ;
done
' xargs-sh