Como adicionar texto em massa aos nomes dos arquivos?

38

Digamos que eu tenha um diretório cheio de .md arquivos todos nomeados várias coisas. Digamos que eu quisesse acrescentar "texto" à frente de cada nome de arquivo. Por exemplo, o arquivo a.md , b.md e c.md se tornaria test - a.md , test - b.md e test - c.md .

Como eu conseguiria isso via linha de comando?

    
por Jesse Atkinson 11.10.2012 / 18:39

7 respostas

50

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 (em sh ):

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

Aqui, nosso NAME é f e nosso WORDS são todos os arquivos no diretório atual que correspondem a *.md . Portanto, a variável $f será substituída por cada arquivo correspondente a *.md .

Então, para a.md :

mv "$f" "test - $f"

torna-se

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

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

mv Foo Bar.md test - Foo Bar.md

que não funcionaria como desejado. Mas ao colocar $f entre aspas, 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 arquivos *.md 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
    
por 11.10.2012 / 21:40
11

Se você tem prename ...

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

Usando comandos comuns do shell:

for file in *.md; do
    mv "$file" "test - $file"
done
    
por 11.10.2012 / 18:42
5

mmv 1 , 2 também é uma ferramenta muito boa para tal tarefa, aplicada ao trabalho atual, seria

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

Claro, 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 isso, especialmente se você tiver muitos desses problemas.

Se você também estiver procurando por uma interface gráfica, tente gprename .

    
por 11.10.2012 / 18:57
4

Em vez de usar um loop for, que falhará nos espaços, a menos que você redefina a variável IFS, eu recomendaria usar um loop while combinado com find. O seguinte irá funcionar quando executado a partir do 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 find imprima apenas o nome do arquivo - sem componentes de caminho que fariam a quebra da operação de renomeação.

    
por 11.10.2012 / 22:31
0

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

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

Você pode testar o comando com:

zmv -wn '*' 'test - $1'
  • -n significa execução a seco, isto é, mostra apenas o que acontecerá.
  • -w implicitamente coloca parênteses em torno de curingas, faz backreferences funcionar.
por 16.10.2012 / 01:13
0

No bash, adicionando "Prepend text -" a todos os arquivos na pasta:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
    
por 22.04.2016 / 16:18
0

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

rename '' 'name -' *.md
    
por 12.08.2018 / 19:45