linux - programacion - Bash script para ejecutar el comando en todos los archivos en un directorio
programacion shell linux ejemplos (6)
Basado en el enfoque de @Jim Lewis:
Aquí hay una solución rápida que utiliza find
y también ordenar los archivos por fecha de modificación:
$ find directory/ -maxdepth 1 -type f -print0 | /
xargs -r0 stat -c "%y %n" | /
sort | cut -d'' '' -f4- | /
xargs -d "/n" -I{} cmd -op1 {}
Para ordenar ver:
http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time
Alguien podría proporcionar el código para hacer lo siguiente: Supongamos que hay un directorio de archivos, todos los cuales deben ejecutarse a través de un programa. El programa saca los resultados a la salida estándar. Necesito un script que vaya a un directorio, ejecute el comando en cada archivo y concat la salida en un archivo de salida grande.
Por ejemplo, para ejecutar el comando en 1 archivo:
$ cmd [option] [filename] > results.out
El siguiente código de bash pasará $ file a comando donde $ file representará cada archivo en / dir
for file in /dir/*
do
cmd [option] "$file" >> results.out
done
Ejemplo
el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Estoy haciendo esto en mi frambuesa pi desde la línea de comandos ejecutando:
for i in *;do omxplayer "$i";done
Qué tal esto:
find /some/directory -maxdepth 1 -type f -exec cmd option {} /; > results.out
-
-maxdepth 1
argumento-maxdepth 1
evita que la búsqueda descienda de forma recursiva a cualquier subdirectorio. (Si desea que dichos directorios anidados se procesen, puede omitir esto). -
-type -f
especifica que solo se procesarán los archivos simples. -
-exec cmd option {}
le dice que ejecutecmd
con laoption
especificada para cada archivo encontrado, con el nombre de archivo sustituido por{}
-
/;
Denota el final del comando. - Finalmente, la salida de todas las ejecuciones de
cmd
individuales se redirige aresults.out
Sin embargo, si le importa el orden en que se procesan los archivos, es mejor que escriba un bucle. Creo que find
procesa los archivos en orden de inodo (aunque podría estar equivocado al respecto), que puede que no sea lo que quieres.
Una forma rápida y sucia que a veces hace el trabajo es:
find directory/ | xargs Command
Por ejemplo, para encontrar el número de líneas en todos los archivos en el directorio actual, puede hacer:
find . | xargs wc -l
Necesitaba copiar todos los archivos .md de un directorio a otro, así que esto es lo que hice.
for i in **/*.md;do mkdir -p ../docs/"$i" && rm -r ../docs/"$i" && cp "$i" "../docs/$i" && echo "$i -> ../docs/$i"; done
Lo que es bastante difícil de leer, así que vamos a desglosarlo.
primer cd en el directorio con tus archivos,
for i in **/*.md;
para cada archivo en su patrón
mkdir -p ../docs/"$i"
ese directorio en una carpeta de documentos fuera de la carpeta que contiene sus archivos. Lo que crea una carpeta extra con el mismo nombre que ese archivo.
rm -r ../docs/"$i"
elimina la carpeta adicional que se crea como resultado de mkdir -p
cp "$i" "../docs/$i"
Copie el archivo real
echo "$i -> ../docs/$i"
Echo lo que hiciste
; done
; done
vive felizmente para siempre