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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top