comando bash para cada archivo en una carpeta

31

Tengo un conjunto de archivos en los que me gustaría aplicar el mismo comando y la salida debe contener el mismo nombre que el archivo procesado pero con una extensión diferente.

Actualmente estoy cambiando el nombre de /my/data/Andrew.doc a /my/data/Andrew.txt. Me gustaría hacer esto para todos los archivos .doc de la carpeta / my / data / y para preservar el nombre.

Probé varias versiones, pero supongo que tengo algo mal en la sintaxis, ya que soy nuevo en Linux.

Robert
fuente
→ un ejemplo un poco más completo y práctico: stackoverflow.com/a/43474757/444255
Frank Nocke

Respuestas:

76

Hay al menos cien mil millones de formas diferentes de abordar esto, pero aquí están los principales contendientes:

The Bash for loop

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

Utilizando find

El findcomando tiene un pequeño execcomando encantador que es excelente para ejecutar cosas (con algunas advertencias). Encontrar es mejor que el globbing básico porque realmente puedes filtrar los archivos que estás seleccionando. Tenga cuidado con la sintaxis extraña.

find . -iname '*.doc' -exec echo "File is {}" \;

Tenga en cuenta que findes recursivo, por lo que puede utilizarlo -maxdepth 1para mantenerse finden el directorio de trabajo actual. -type fse puede usar para filtrar archivos normales.

Si solo estamos cambiando el nombre de doc a txt ...

El renamecomando es como sed en la búsqueda. Obviamente, esto no hará nada para convertir el formato.

rename 's/doc$/txt/' *.doc
Oli
fuente
22
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
DIRAVI
fuente