2010-11-10 31 views
14

¿Cómo puedo ejecutar un determinado comando para cada archivo/carpeta en la carpeta actual?Ejecutar comando para cada archivo en el directorio actual

Comencé con esto como un script base, pero parece que solo funciona cuando uso archivos temporales, y realmente no me gusta el ideea. ¿Hay alguna otra manera?

FOLDER="."; 
DIRS=`ls -1 "$FOLDER">/tmp/DIRS`; 

echo >"/tmp/DIRS1"; 
while read line ; do 
    SIZE=`du "$FOLDER$line"`; 
    echo $SIZE>>"/tmp/DIRS1"; 
done < "/tmp/DIRS"; 

Para cualquier persona interesada, quería hacer una lista de carpetas, ordenados por su tamaño. Aquí está el resultado final

FOLDER="$1"; 
for f in $FOLDER/*; do 
    du -sb "$f"; 
done | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||"; 

que conduce a du -sb $FOLDER/* | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||";

+3

Son directorios. No carpetas ;) –

+0

Ver mi respuesta [aquí] (http: // serverfault.com/q/62411/1293 # 62522) para una forma de hacerlo llamando 'du' solo una vez en lugar de * dos veces para cada archivo *. No necesitarás un bucle 'for'. Puede agregar '--max-depth = 1' al' du' si es necesario y puede agregar su 'sed 's | $ FOLDER ||" '. –

+0

@Dennis Williamson: buena respuesta, no busqué 'awk'. – Quamis

Respuesta

25

Tal vez xargs, que reinvoca el comando especificado después de que para cada línea adicional de parámetros recibidos en la entrada estándar ...

ls -1 $FOLDER | xargs du 

Pero, en este caso, ¿por qué no ...

du * 

...? O ...

for X in *; do 
    du $X 
done 

(Personalmente, yo uso zsh, donde se puede modificar el patrón global no encontrar más que decir archivos regulares, o sólo directorios, sólo enlaces simbólicos, etc - Estoy bastante seguro de que hay algo similar en bash - puede cavar para obtener detalles si lo necesita).

¿Me falta parte de tu requerimiento?

+0

El script final debe mostrar una lista de archivos/carpetas ordenados por tamaño, ordenados por tamaño – Quamis

+1

+1 para 'xargs'. Maravillosamente subestimado herramienta. –

+0

Ah bien, en ese caso 'du * | ordenar -n -k1' solo debería ser suficiente. ¿No? –

0

Esto funciona para todos los archivos en el directorio actual:

do 
    /usr/local/mp3unicode/bin/mp3unicode -s cp1251 --id3v2-encoding unicode "$file" 
done 
2

Es inútil para analizar la salida de ls para desplazarse sobre los archivos. Bash puede hacerlo con la expansión de comodines.

Almacenar el resultado de du en una variable para enviarlo a un archivo también es un uso inútil de una variable.

lo que sugieren:

for i in ./tmp/DIRS/* 
do 
    du "$i" >> "/tmp/DIRS1" 
done 
3

¿Qué pasa con algo como esto?

function process() { 
    echo "Processing $1" 
} 

for i in * 
do 
    process $i 
done 

Usted puede poner todo el "trabajo" que quiere hacer dentro de la función process. Esto lo hará para su directorio actual.

+0

¿Puede mirar este caso? https://stackoverflow.com/questions/45482766/script-to-execute-command-to-all-files-in-folder?noredirect=1#comment77926070_45482766 – upicik

6

El comando find le permitirá ejecutar un comando para cada elemento que encuentre, también. Sin más argumentos que se encuentran todos los archivos y carpetas en el directorio actual, así:

$ find -exec du -h {} \; 

La parte {} es la "variable" donde se coloca el partido, aquí como argumento para du. \; finaliza el comando.

+2

Esta es la primera vez que veo un ejemplo de ' find' que realmente explica cómo funciona el comando completo dado. ¡Gracias! – alanaktion

Cuestiones relacionadas