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