sintaxis programacion ejemplos comandos comando basicos linux bash scripting

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 ejecute cmd con la option 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 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 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