Come anteporre in massa il testo ai nomi dei file?


44

Diciamo che ho una directory piena di .mdfile con tutti i nomi di varie cose. Diciamo che volevo anteporre "testo" all'inizio di ogni nome di file. Così, per esempio: file a.md, b.mde c.mdsarebbe diventato test - a.md, test - b.mde test - c.md.

Come potrei farlo tramite la riga di comando?

Risposte:


60

One-liner che può essere facilmente digitato direttamente dal terminale:

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

O riscritto su righe separate usando invece i punti e virgola:

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

Esposizione

Sintassi di for(in sh):

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

Qui, our NAMEis fe our WORDSsono tutti i file nella corrispondenza della directory corrente *.md. Quindi la variabile $fverrà sostituita con ogni corrispondenza del file *.md.

Quindi per a.md:

mv "$f" "test - $f"

diventa

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

Le virgolette sono importanti perché ogni nome file $fpotrebbe contenere spazi. Altrimenti mvpenserei che ogni parola fosse un file separato. Ad esempio, se non c'erano virgolette e c'era un file chiamato Foo Bar.md, si tradurrebbe in:

mv Foo Bar.md test - Foo Bar.md

che non funzionerebbe come previsto. Ma racchiudendo le $fvirgolette, ha senso:

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

Notando la sintassi di for, puoi anche rinominare un sottoinsieme di tutti i *.mdfile nominandoli esplicitamente:

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

O usando l'espansione della shell:

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

Questo è esattamente quello che dovevo vedere. Grazie!
Ryan,

11

Se hai prename...

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

Usando i normali comandi shell:

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

Come ottengo prename?
Gaʀʀʏ

Sembra essere preinstallato per me su Ubuntu 16.04 LTS. Hai provato il tuo gestore di pacchetti (es., sudo apt-get install)?
Orion751,

5

mmv1 , 2 è anche uno strumento molto utile per tale compito, applicato al lavoro corrente, sarebbe

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

Naturalmente, se si desidera solo aggiungere "test -" a a.md, b.md e c.md, ma non a1.md, qualcosa di simile

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

sarebbe più appropriato.

Posso davvero suggerirlo, soprattutto se hai molti di questi problemi.

Se stai inoltre cercando un'interfaccia grafica, prova gprename .


5

Invece di usare un ciclo for, che fallirà negli spazi a meno che non si ridefinisca la variabile IFS, consiglierei di usare un ciclo while combinato con find. Di seguito funzionerà quando eseguito dalla stessa directory dei file

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

la riga "basename" è lì in modo che find stamperà solo il nome del file - senza componenti del percorso che farebbero interrompere l'operazione di rinomina.


2

So che è davvero tardi, ma se qualcun altro è alla ricerca di qualcosa del genere, allora ha funzionato per me:

rename '' 'name -' *.md

1
semplice e diretto
user13743

0

Se hai a zshdisposizione puoi usare zmv:

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

Puoi testare il comando con:

zmv -wn '*' 'test - $1'
  • -n significa funzionamento a secco, ovvero mostra solo cosa accadrà.
  • -w mette implicitamente la parentesi attorno ai caratteri jolly, fa funzionare i riferimenti secondari.

0

In bash, aggiungendo "Prepend text -" a tutti i file nella cartella:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

Questo è un modo di scrivere lunghissimofor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.