Cómo leer tokens de un archivo de entrada para eliminar los archivos mencionados allí

Cómo leer tokens de un archivo de entrada para eliminar los archivos mencionados allí

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 IFScomando.

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 directoryvariable y el resto de la línea en la prefixvariable. 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 findbuscar de forma recursiva, es que $prefixse utilizará como si fuera un patrón global en el findcomando.

Tenga en cuenta que *debe citarse cuando se usa con findpara que el shell no lo expanda a nombres coincidentes en el directorio actual, y eso *debería serno cotizadocuando se usa con rmen 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 findrestringido 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

información relacionada