2012-06-12 12 views
9

Permítanme describir primero mi situación, estoy trabajando en una plataforma Linux y tengo una colección de archivos .bmp que agregan uno al número de foto de filename0022.bmp hasta filename0680.bmp. Entonces un total de 658 imágenes. Quiero poder ejecutar cada una de estas imágenes a través de un archivo .exe que funciona en la imagen y luego ejecuta el archivo en un archivo especificado por el usuario, también tiene algunos argumentos de umbral: inferior, superior. Por lo que la llamada típica para el ejecutable es:¿Cómo hacer un bucle de un comando ejecutable en el terminal en Linux?

./filter inputfile outputfile lower upper 

¿Hay una manera que puede recorrer esta llamada a través de todos los archivos sólo desde el terminal o mediante la creación de algún tipo de escritura del golpe? Mi problema es similar a esto: Execute a command over multiple files with a batch file pero esta vez estoy trabajando en una terminal de línea de comandos de Linux.

Respuesta

6

Usted puede intentar algo como esto ...

#! /bin/bash 
for ((a=022; a <= 658 ; a++)) 
do 
    printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh" 
done 
+1

esto es lo que probé e imprimió un montón de cosas algo relevantes para mi pantalla, pero en realidad no creó ningún archivo ... #!/Bin/bash para ((a = 022; a <= 680; a ++)) hacer printf" ./filter feto-00-2.3.5um__voi0% 04d.bmp fetus_threshold_% 04d 90 240" $ a hecho donde 90 y 240 son los argumentos inferior y superior que mencioné anteriormente. No he hecho un script bash, así que usé emacs para crear un archivo donde escribí las líneas de código anteriores. Luego guardé el archivo emacs simplemente como prueba. sin nada detrás porque eso es lo que vi hacer en línea. ¿Algún consejo más? –

+0

intente convertirlo en un archivo .sh (con la nueva adición que hice anteriormente) y luego ejecute el archivo escribiendo [[bash myfile.sh]] en el mismo directorio – scottyaz

+0

Bueno, buenas noticias ... al menos itera esto tiempo e incluso funciona en la primera imagen, luego recibo algunos errores del software que está usando el ejecutable. Lo que no entiendo es que está intentando comenzar en inputfile0000 y le decimos que comience con inputfile0022.bmp. La única imagen de salida que obtengo es outputfile0000.bmp. Aquí está el archivo bash que guardé como threshold.sh: #!/bin/bash para ((a = 022; a <= 680; a ++)) do printf "./filter6 fetus-00-2_3.5um__rec_voi% 04d.bmp fetus_threshold_% 04d.bmp 90 240" $ a | "sh" hecho –

1

Se puede probar que AS-IS en la shell:

for i in *; do 
    echo "$i" | tr '[:lower:]' '[:upper:]' 
done 

Si usted tiene un camino especial, modificar * por su trayectoria + un pegote: Ex:

for i in /home/me/*.exe; do ... 

Ver http://mywiki.wooledge.org/glob

+0

asumiendo que se encuentra en el directorio correcto: =) – ant

+1

editado para explicar esta posibilidad =) –

+0

bueno Sputnick, Podría ayudarme a entender el trozo de código que escribió más arriba? Veo que tiene un bucle for que repasa todo, pero no ve a dónde llama el ejecutable para procesar las imágenes. ¿Podría darme un poco más de detalle y explicación? Gracias por tu ayuda y publicaciones. Es genial obtener tanta ayuda en tan poco tiempo. –

0

Esto mientras antepone el nombre de las imágenes de salida como filtered_filename0055.bmp

for i in *; do 
    ./filter $i filtered_$i lower upper 
done 
+0

Esto sobrescribirá el archivo fuente, supongo. –

+0

¿Qué pasa si un archivo tiene un espacio en él? Entonces el comando se resolverá en './filter file withspace filtered_file withspace lower upper'. Probablemente deberías citar '" $ i "' cuando lo estés usando. –

+1

@TimPote Solo trato de hacerlo lo más simple posible en función de la información de la pregunta, pero sí las comillas lo harán mejor también buscando alguna extensión de archivo y directorio. –

11

Usted puede estar interesado en mirar en secuencias de comandos bash.

Puede ejecutar comandos en un bucle for directamente desde el shell.

Un simple bucle para generar los números que ha mencionado específicamente. Por ejemplo, a partir de la cáscara:

[email protected] $ for i in {22..680} ; do 
> echo "filename${i}.bmp" 
> done 

Esto le dará una lista filename22.bmp-filename680.bmp. Eso simplemente maneja la iteración del rango que has mencionado. Esto no cubre cero números de relleno. Para hacer esto, puede usar printf. La sintaxis printf es printf format argument. Podemos usar la variable $i de nuestro ciclo anterior como argumento y aplicar el formato %Wd donde W es el ancho. Al fijar el marcador de posición W, se especificará el carácter que se usará. Ejemplo:

[email protected] $ for i in {22..680} ; do 
> echo "filename$(printf '%04d' $i).bmp" 
> done 

En los anteriores $() actúa como una variable, la ejecución de comandos para obtener el valor en oposición a un valor predefinido.

Esto ahora debería darle los nombres de archivo que había especificado. Podemos tomar eso y aplicarlo a la aplicación real:

[email protected] $ for i in {22..680} ; do 
> ./filter "filename$(printf '%04d' $i).bmp" lower upper 
> done 

Esto puede ser reescrita para formar una línea:

[email protected] $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done 

Una cosa a destacar de la cuestión, los archivos .exe son generalmente compilados en Formato COFF donde Linux espera un ejecutable de formato ELF.

+0

the 'user @ machine $ 'es simular un mensaje de shell, el'> 'simula la continuación de la solicitud esperando más antes de completar el comando para su ejecución. –

7

aquí es un ejemplo sencillo:

for i in {1..100}; do echo "Hello Linux Terminal"; done 

para anexar un archivo: (>> se utiliza para añadir, también se puede utilizar> sobrescribir)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done 
1

Puede aprovechar xargs para la iteración:

ls | xargs -i ./filter {} {}_out lower upper 

Nota:

  • {} corresponde a una salida de línea de la tubería, aquí está el nombre del archivo de entrada.
  • Los archivos de salida se nombrarán con postfix '_out'.
Cuestiones relacionadas