comando bash para cada arquivo em uma pasta

31

Eu tenho um conjunto de arquivos nos quais gostaria de aplicar o mesmo comando e a saída deve conter o mesmo nome que o arquivo processado, mas com uma extensão diferente.

No momento, estou renomeando /my/data/Andrew.doc para /my/data/Andrew.txt. Gostaria de fazer isso para todos os arquivos .doc da pasta / my / data / e para preservar o nome.

Eu tentei várias versões, mas acho que tenho algo errado na sintaxe, pois sou novo no linux.

Robert
fonte
→ um pouco mais completa e exemplo prático: stackoverflow.com/a/43474757/444255
Frank Nocke

Respostas:

76

Existem pelo menos cem milhões de maneiras diferentes de abordar isso, mas aqui estão os principais candidatos:

O Bash para loop

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

Usando find

O findcomando possui um pequeno e adorável execcomando que é ótimo para executar coisas (com algumas ressalvas). Encontrar é melhor do que o globbing básico, porque você pode realmente filtrar os arquivos que está selecionando. Cuidado com a sintaxe ímpar.

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

Observe que findé recursivo, portanto, você pode querer usar -maxdepth 1para mantê-lo findno diretório de trabalho atual. -type fpode ser usado para filtrar arquivos regulares.

Se estamos apenas renomeando doc para txt ...

O renamecomando é semelhante a sed na pesquisa. Obviamente, isso não fará nada para converter o formato.

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