Tengo que lidiar con una gran cantidad de archivos anidados dentro de los directorios (un archivo por directorio), parecido a esto:
fred/result.txt
john/result.txt
mary/result.txt
...
Actualmente estoy usando el siguiente comando para procesar cada uno de esos archivos:
find . -maxdepth 1 -type d ( ! -name . ) -exec bash -c "cd '{}' && processResult result.txt" ;
Estoy buscando algo que pueda agregar al final de este comando que cambiará los nombres de archivo a fred.txt
, etc. y luego mueva el archivo al directorio principal para eliminar la capa adicional de directorios.
¿Cuál sería la mejor manera de hacer esto?
Respuesta aceptada:
Podemos usar el enfoque clásico:find
con while read
combinación:
Demostración:
$ ls *
fred:
results.txt
jane:
results.txt
john:
results.txt
$> find . -type f -name "results.txt" -printf "/%Pn" | while read FILE ; do DIR=$(dirname "$FILE" );
> mv ."$FILE" ."$DIR""$DIR".txt;done
$> ls
fred/ jane/ john/
$> ls *
fred:
fred.txt
jane:
jane.txt
john:
john.txt
Usar echo
antes de usar mv
para probar la línea con sus archivos.
Mejora menor
Podemos incrustar la llamada a bash
en exec , con expansión de parámetros (específicamente eliminación de prefijos). Básicamente, está incrustando un script en la llamada ejecutiva.
$> find "$PWD" -type f -name "results.txt" -exec bash -c ' DIR=$( dirname "{}" ); echo "{}" "$DIR"/"${DIR##*/}".txt ' ;
/home/xieerqi/TESTDIR/fred/results.txt /home/xieerqi/TESTDIR/fred/fred.txt
/home/xieerqi/TESTDIR/jane/results.txt /home/xieerqi/TESTDIR/jane/jane.txt
/home/xieerqi/TESTDIR/john/results.txt /home/xieerqi/TESTDIR/john/john.txt
Para hacer que el comando sea general (funciona para cualquier archivo, no solo results.txt
) ) simplemente elimine -name "results.txt"
parte. También vea esta publicación para una solución Python alternativa a esto.