Scorciatoia Shell / Bash per rinominare in massa i file in una cartella

Esiste un collegamento in Shell / Bash che può rinominare tutti i file in una cartella in base a un’espressione regolare o ad altri criteri. Quello che sto cercando qui è nei miei documenti di cartella, che diciamo un 100 file di testo con la seguente convenzione di denominazione:

-doc-.txt. 

Devo rinominare tutti i file con la convenzione sopra indicata solo per:

 doc-.txt 

C’è una sola linea che può aiutarmi con quanto sopra?

Suggerirei qualcosa come questo:

 for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done 

${i/*-doc-/doc-} sostituisce la prima occorrenza di *-doc- con doc- .

Se è necessario eseguire più di una sostituzione (vedere il commento numero 1), è necessario utilizzare la variante ${var//Pattern/Replacement} . Se è necessario sostituire l’inizio del nome, è necessario utilizzare ${var/#Pattern/Replacement} , se è necessario sostituire la fine (es .: l’estensione) è necessario utilizzare ${var/%Pattern/Replacement} forma.

Vedi http://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1 per maggiori dettagli

Se hai rename 's/^.*-doc-/doc-/' *.txt rename allora, rename 's/^.*-doc-/doc-/' *.txt dovrebbe fare il trucco.

C’è un prename , che ti permette di usare REGEX:

 prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt 

Utilizza l’opzione -n per simulare:

 prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt 

Nota: questo è il nome fornito in molte distribuzioni Linux, ma non in tutte, quindi sto utilizzando il nome canonico per l’utilità fornita con Perl.

Il comando di rinomina incorporato nella maggior parte di Linux, ad es., Lo farà facilmente.

Personalmente preferisco le espressioni regolari, motivo per cui ho continuato a scrivere questo copione per un tempo molto molto lungo (leggi: dalla fine degli anni ’80 o dai primi anni ’90):

 #!/usr/bin/perl ($op = shift) || die "Usage: $0 expr [files]]\n"; if([email protected]) { @ARGV = ; chop(@ARGV); } for (@ARGV) { $was = $_; eval $op; die [email protected] if [email protected]; if ($was ne $_) { print "rename($was,$_)\n"; rename($was,$_); } } 

Che, quando installato ti permette di fare cose come questa:

 script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt 

Se si desidera accedere a sottodirectory, è anche ansible:

 find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv 

Sul sistema che supporta automaticamente Regexps esteso, è ansible lasciare il -E .

vantaggi:

  • ricorre in sottodirectory
  • puoi controllare il massimo della ricorsione
  • puoi rinominare file e / o directory (-type f | d)

svantaggi:

  • regex leggermente più complicate, perché devi rimuovere il percorso per ottenere il nome del file

(risposta modificata da qui )

 mmv "*-doc-*" "doc-#2" 

Il comando mmv sta per “move di massa”

Se non ti interessa lo strumento esterno, eccone uno: rnm ( pagina web )

Per il tuo problema particolare il comando sarebbe:

 rnm -rs '/.*-doc-/doc-/' *.txt 

O

 rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt 

Puoi trovare altri esempi / documenti qui .

trova . -name ‘* scss’ | xargs -L1 -I {} echo {} {} | sed ‘s / css.scss $ / scss /’ | xargs -L1 mv

per esempio se hai un sacco di file che terminano con “.css.scss” e vuoi rinominarli per terminare semplicemente con “.scss” (cioè rimuovere la parte .css)

modificare l’espressione regolare e trovare argomenti per le vostre esigenze