Bash One Liner:copiare template_*.txt in foo_*.txt?
-
09-06-2019 - |
Domanda
Supponiamo che io abbia tre file (template_*.txt):
- modello_x.txt
- modello_y.txt
- modello_z.txt
Voglio copiarli in tre nuovi file (foo_*.txt).
- foo_x.txt
- foo_y.txt
- foo_z.txt
C'è un modo semplice per farlo con un comando, ad es.
cp --enableAwesomeness template_*.txt foo_*.txt
Soluzione
for f in template_*.txt; do cp $f foo_${f#template_}; done
Altri suggerimenti
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
template_x.txt template_y.txt template_z.txt
[01:22 PM] matt@Lunchbox:~/tmp/ba$
for i in template_*.txt ; do mv $i foo${i:8}; done
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
foo_x.txt foo_y.txt foo_z.txt
Il mio modo preferito:
for f in template_*.txt
do
cp $f ${f/template/foo}
done
Il metodo "Non ricordo la sintassi di sostituzione":
for i in x y z
do
cp template_$i foo_$
done
Questo dovrebbe funzionare:
for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
Probabilmente si rompe se i nomi dei file contengono caratteri strani.Rimuovi la "-v" quando (se) hai la certezza che funzioni in modo affidabile.
Il comando mmv
(disponibile in Debian O Fink o facile da compilare da soli) è stato creato proprio per questo compito.Con la semplice soluzione Bash, devo sempre cercare la documentazione sull'espansione delle variabili.Ma mmv
è molto più semplice da usare, abbastanza vicino alla "fantasia"!;-)
Il tuo esempio sarebbe:
mcp "template_*.txt" "foo_#1.txt"
mmv
può gestire anche modelli più complessi e ha alcuni controlli di integrità, ad esempio, si assicurerà che nessuno dei file nel set di destinazione appaia nel set di origine (quindi non puoi sovrascrivere accidentalmente i file).
Non conosco nulla in bash o su cp, ma ci sono modi semplici per fare questo genere di cose usando (ad esempio) uno script perl:
($op = shift) || die "Usage: rename perlexpr [filenames]\n";
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
Poi:
rename s/template/foo/ *.txt
Ancora un altro modo per farlo:
$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
Sono sempre stato impressionato da ImageMagick convertire programma che fa quello che ti aspetti con i formati di immagine:
$ convert rose.jpg rose.png
Ha un programma gemello che consente conversioni batch:
$ mogrify -format png *.jpg
Ovviamente questi sono limitati alle conversioni di immagini, ma hanno interessanti interfacce a riga di comando.