2011-12-14 11 views
11

Quiero escribir una shellscript que hará un bucle a través de todos los archivos en una carpeta y echo "poner $ {nombre del archivo}". ¿Alguien puede señalarme en la dirección correcta?Shellscript bucle a través de todos los archivos en una carpeta

+2

¿Qué ha probado? ¿Qué parte de la instrucción 'for' y' '' te confunde? ¿Puedes ser más específico sobre lo que sabes y lo que no sabes sobre el caparazón? –

+0

encontré con esto - una advertencia a cualquier persona que utilice esto como una referencia - las respuestas no manejan correctamente los nombres de archivo con espacios ... consulte https://stackoverflow.com/questions/7039130/iterate-over-list- of-files-with-spaces para una mejor solución !!! – blackghost

Respuesta

15
for filename in *; do echo "put ${filename}"; done 
+1

Si el directorio actual pasa a ser vacía, esta salida es "poner *" en lugar de dar salida correctamente nada. ¿Se puede arreglar? – JWWalker

3

recursivamente, incluidos los archivos en los subdirectorios?

find dir -type f -exec echo "put {}" \; 

¿Solo archivos en ese directorio?

find dir -maxdepth 1 -type f -exec echo "put {}" \; 
+0

me sale el error 'Encontrar 'dir': No existe el fichero o directory' cuando se trata de esto. – gbmhunter

+1

Tontímeme, por dir querías decir reemplaza con el directorio que deseas. Aún así, un poco confuso! – gbmhunter

5
for file in *; do 
    echo "put $file" 
done 

O bien, si desea incluir los subdirectorios:

find . -type f -exec echo put {} \; 

Si desea incluir las carpetas a sí mismos, sacar la parte -type f.

1

Uno más alternativa que utiliza ls y sed:

$ ls -1 <dir> | sed -e 's/^/put /' 

y el uso de ls y xargs:

$ ls -1 <dir> | xargs -n1 -i%f echo 'put %f' 
+0

1, pero -1 no es necesaria y se puede hacer sed -e 's/^/venta /' –

+0

@WilliamPursell Gracias, he actualizado mi respuesta. De alguna manera, malentendí e hice que las llaves y el signo de dólar fueran parte de la solución. Además, tuve otra solución con 'xargs' y' echo', pero el 'sed' es aún más conciso. – jcollado

0

esto va a funcionar también de forma recursiva si tiene alguna subdirectorios y archivos dentro de ellos:

find . -type f|awk -F"/" '{print "put ",$NF}' 
2

Si y Si no tiene ningún archivo, en lugar de imprimir * podemos hacerlo.

format=*.txt 
for i in $format; 
do 
if [[ "$i" == "$format" ]] 
then 
    echo "No Files" 
else 
    echo "file name $i" 
fi 
done 
Cuestiones relacionadas