Rimuovi alcuni caratteri da più file con spazi bianchi


8

Sto cercando di rinominare un sacco di brani musicali in una directory, ma ho riscontrato questo errore:

Quando si spostano più file, l'ultimo argomento deve essere una directory

Questo è lo script:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Funziona con un file senza spazi bianchi, come dovrei modificare questo script?

Risposte:


14

Usa le virgolette:

mv -- "$file" "$(echo "$file" | sed ...)"

Altrimenti mvvede più argomenti. Un nome file chiamato file name with spacessarebbe 4 argomenti per mv. Quindi l'errore: when moving multiple files, last argument must be a directory. Quando mvha più di 2 argomenti, si presuppone che si desideri spostare più file in una directory (che sarebbe quindi l'ultimo argomento).


Tuttavia, sembra che tu voglia rimuovere i primi 5 caratteri dal nome del file. Questo può essere fatto più semplice con bash:

mv -- "$file" "${file:5}"

Modifica : ho aggiunto la --bandiera, grazie al commento di @ pabouk . Ora anche i file che iniziano con trattino -vengono elaborati correttamente.


2
Potrebbe non funzionare con i nomi di file che iniziano per -. Invece di echo "$file"usare printf '%s\n' "$file".
pabouk,

Me ne sono dimenticato mv. :) Hai gestito quel caso :) --- Quello che intendevo era un problema con echose stesso. Per esempio GNU eco (sia stand-alone e bash built-in) non stampa queste stringhe: -n, -ee -E. Anche secondo la definizione POSIX non è possibile utilizzarlo in echomodo affidabile perché determinate situazioni non sono definite. La conformità XSI echointerpreterà le sequenze di escape con barra rovesciata. --- printf '%s\n'non ha effetti così indesiderati e dipendenti dall'implementazione.
pabouk,

3

Puoi usare prename, che è spesso distribuito insieme a Perl. (Ad esempio, in Debian, / usr / bin / prename è installato dal perlpacchetto.) Se non è impacchettato dalla tua distribuzione (cerca prenamee renamenelle posizioni binarie convenzionali), è disponibile per il download da un numero di posizioni, come per esempio qui , qui o qui .

Questo script utilizza un'espressione regolare da applicare a ciascuno dei nomi di file e una serie di nomi di file e modifica i nomi di tali file in base a tale espressione regolare.

Ad esempio, potresti farlo

prename -v -n 's/^.{5}//' *

per mostrare cosa accadrebbe se si rimuovessero i primi cinque caratteri nei nomi dei file. Per eseguire effettivamente la ridenominazione, è sufficiente rimuovere il -n.

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.