come rinominare i file durante la copia?


12

Come copierei (stile di archivio in cui la data non viene modificata) tutti i file in una directory di backup nella directory dell'utente durante la ridenominazione di ogni file per rimuovere la porzione di stringa casuale dal nome (ovvero -2b0fd460_1426b77b1ee_-7b8e)?

cp da:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

per:

/home/user/data/Erp.2014.02.16_16.57.03.etf

Ogni file inizierà sempre con "Erp". seguito dalla stringa di data e ora seguita dalla stringa casuale e quindi dall'estensione ".etf". Voglio mantenere tutti gli elementi del nome incluso il timbro data-ora. Voglio solo rimuovere la stringa casuale.

La stringa casuale consente più backup dello stesso file. Tuttavia, in questo caso, ho appena eseguito fdupes e non ci sono duplicati. Quindi posso semplicemente ripristinare tutti i file, rimuovendo la stringa casuale.

Sto cercando un comando bash a una riga per farlo.

Se non funziona, potrei farlo in due o più passaggi. Di solito uso KRename, ma in questo caso devo farlo in bash. (Sto lavorando da remoto.)

Risposte:


7

paxpuoi farlo tutto in una volta. Potresti fare:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxconserva i tempi di default, ma può aggiungere -peper preservare tutto (meglio fatto come root) o -ppper conservare le autorizzazioni, ad esempio:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

Altrimenti (di paxsolito non è disponibile per impostazione predefinita), sicuramente è meglio fare una copia quindi un rename:

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

In questo modo non è stato avviato un processo diverso per ciascun file.


1
Vedo che devo familiarizzare con pax. Questo sembra uno strumento molto utile. Mi chiedo perché non sia standard in più distro ...
MountainX,

@MountainX, Una buona domanda, secondo Wikipedia, paxè stata nella base standard di Linux dal 2005. Inoltre sarebbe un'alternativa per questo, GNU cpio, è forse lo strumento GNU meno caratteristico esistente.
Graeme,

1
+1 per l'ultima soluzione e in questo modo non è stato avviato un processo diverso per ciascun file. Ma rename è diverso su Fedora / Red Hat: non so come usarlo in questo caso.
Erik,

15

È possibile utilizzare il cpcomando con l' -aopzione

-a, --archive
       same as -dR --preserve=all

Quindi usa un ciclo for per rinominare tutti i file mentre li copi:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

Pronto. Avviare questo comando nella directory di origine.

Spiegazione: Il carattere %%-*verrà interrotto dopo la prima occorrenza di un trattino / meno -e .etfalla fine verrà aggiunta nuovamente l'estensione del file.

Bene, e come una fodera, metti tutto in una riga. :-) Come questo

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
Grazie, potresti per favore citare la documentazione per il %%-*suggerimento? Sono curioso.
soyuka,

3

In zsh, utilizzare zmv. Metti questo nel tuo .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

Quindi utilizzare

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

In bash:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Se non hai zsh, un modo POSIX usa pax (questo copia ricorsivamente le directory).

Se utilizzi un sistema limitato senza zsh e senza pax, puoi utilizzare un loop:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cpnon ha questa capacità. Ricordo di cpioessere stato in grado di farlo, ma l'attuale manpage dice il contrario. Tuttavia, (gnu) tarha --transformun'opzione:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

Quindi avresti un cmdline come:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
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.