Script Bash para ejecutar el comando en todos los archivos en un directorio

¿Podría alguien 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 progtwig. El progtwig envía los resultados a la salida estándar. Necesito un script que vaya a un directorio, ejecute el comando en cada archivo y concatene 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 bash pasará $ file al 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 

Qué tal esto:

 find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out 
  • -maxdepth 1 argumento evita que el -maxdepth 1 descienda recursivamente a cualquier subdirectorio. (Si desea que dichos directorios nesteds se procesen, puede omitir esto).
  • -type -f especifica que solo se procesarán los archivos sin formato.
  • -exec cmd option {} le dice que ejecute cmd con la option especificada para cada archivo encontrado, con el nombre de archivo sustituido por {}
  • \; denota el final del comando.
  • Finalmente, el resultado de todas las ejecuciones de cmd individuales se redirige a results.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 inode (aunque podría estar equivocado al respecto), que puede no ser lo que quieres.

Estoy haciendo esto en mi pi raspberry desde la línea de comandos ejecutando:

 for i in *;do omxplayer "$i";done 

Basado en el enfoque de @Jim Lewis:

Aquí hay una solución rápida que usa find y también ordenar archivos por su 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

Una manera rápida y sucia que hace el trabajo a veces 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 cual es bastante difícil de leer, así que desglosémoslo.

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 tus archivos. Lo cual crea una carpeta adicional 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 vivir feliz para siempre