Como anexar em massa o texto aos nomes dos arquivos?

44

Digamos que eu tenho um diretório cheio de .mdarquivos, todos nomeados de várias coisas. Digamos que eu queria acrescentar "texto" à frente de cada nome de arquivo. Assim, por exemplo: file a.md, b.mde c.mdse tornaria test - a.md, test - b.mde test - c.md.

Como eu faria isso via linha de comando?

Jesse Atkinson
fonte

Respostas:

60

Uma linha que pode ser facilmente digitada diretamente do terminal:

for f in *.md; do mv "$f" "test - $f"; done

Ou reescrito em linhas separadas, usando ponto e vírgula:

for f in *.md
do
    mv "$f" "test - $f"
done

Exposição

Sintaxe de for(in sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Aqui, nosso NAMEé fe nosso WORDSsão todos os arquivos no diretório atual correspondente *.md. Portanto, a variável $fserá substituída por cada arquivo correspondente *.md.

Então para a.md:

mv "$f" "test - $f"

torna-se

mv "a.md" "test - a.md"

As aspas são importantes porque o nome de cada arquivo $fpode conter espaços. Caso contrário, mvpensaria que cada palavra era um arquivo separado. Por exemplo, se não houver aspas e houver um arquivo chamado Foo Bar.md, ele será traduzido como:

mv Foo Bar.md test - Foo Bar.md

o que não funcionaria como pretendido. Mas, ao colocar $faspas, faz sentido:

mv "Foo Bar.md" "test - Foo Bar.md"

Observando a sintaxe de for, você também pode renomear um subconjunto de todos os *.mdarquivos nomeando cada um explicitamente:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Ou usando a expansão do shell:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
QuasarDonkey
fonte
Isso é exatamente o que eu precisava ver. Obrigado!
1919 Ryan
11

Se você tem prename...

prename 's/^/test - /' *.md

Usando comandos comuns do shell:

for file in *.md; do
    mv "$file" "test - $file"
done
gravidade
fonte
Como eu ganho prename?
Gaʀʀʏ
Parece estar pré-instalado para mim no Ubuntu 16.04 LTS. Você já experimentou o seu gerenciador de pacotes (ou seja, sudo apt-get install)?
Orion751
5

mmv1 , 2 também é uma ferramenta muito boa para essa tarefa, aplicada ao trabalho atual, seria

mmv '*.md' 'test - #1.md'

Obviamente, se você quiser adicionar "test -" a a.md, b.md e c.md, mas não a1.md, algo como

mmv '?.md' 'test - #1.md'

seria mais apropriado.

Eu realmente posso sugerir, especialmente se você tiver muitos desses problemas.

Se você estiver procurando adicionalmente por uma interface gráfica, tente gprename .

Cláudio
fonte
5

Em vez de usar um loop for, que falhará em espaços, a menos que você redefina a variável IFS, eu recomendaria o uso de um loop while combinado com find. O seguinte funcionará quando executado no mesmo diretório que os arquivos

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

a linha "basename" está lá para que o find imprima apenas o nome do arquivo - sem componentes de caminho que fariam a operação de renomeação ser interrompida.

Fred Clausen
fonte
2

Eu sei que é muito tarde, mas se alguém mais estiver procurando por algo assim, isso funcionou para mim:

rename '' 'name -' *.md
nullptr
fonte
11
simples e direto
user13743
0

Se você tiver zshdisponível, poderá usar zmv:

autoload zmv
zmv -w '*' 'test - $1'

Você pode testar o comando com:

zmv -wn '*' 'test - $1'
  • -n significa funcionamento a seco, ou seja, apenas mostra o que vai acontecer.
  • -w coloca implicitamente parênteses em caracteres curinga, faz com que as referências anteriores funcionem.
Thor
fonte
0

No bash, adicione "Anexar texto -" a todos os arquivos na pasta:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
Osíris
fonte
Esta é uma maneira super-longa da escritafor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby