2008-08-25 18 views
8

Decir que tengo tres archivos (. Plantilla _ * .txt):Bash One Liner: copy template _ *. Txt to foo _ *. Txt?

  • template_x.txt
  • template_y.txt
  • template_z.txt

quiero copiar a tres nuevos archivos (foo _ *. txt).

  • foo_x.txt
  • foo_y.txt
  • foo_z.txt

¿Hay alguna forma sencilla de hacer eso con un solo comando, por ejemplo,

cp --enableAwesomeness template_*.txt foo_*.txt

Respuesta

11
 
for f in template_*.txt; do cp $f foo_${f#template_}; done 
1

No sé de nada en bash o en cp, pero hay maneras simples de hacer este tipo de cosas utilizando (por ejemplo) un script en perl:

($op = shift) || die "Usage: rename perlexpr [filenames]\n"; 

for (@ARGV) { 
    $was = $_; 
    eval $op; 
    die [email protected] if [email protected]; 
    rename($was,$_) unless $was eq $_; 
} 

Entonces :

rename s/template/foo/ *.txt 
+0

En mi sistema Debian, hay un script de Perl instalado en '/ usr/bin/rename' (parte del paquete' perl') que hace exactamente esto. –

1
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done 

Probablemente se rompe si sus nombres de archivo tienen caracteres extraños en ellos. Elimine el '-v' cuando (si) obtiene la confianza de que funciona de manera confiable.

2

Esto debería funcionar:

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done 
0

Sin embargo, otra manera de hacerlo:

$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx 

Siempre he estado impresionado con el programa ImageMagick convert que hace lo que usted esperar con formatos de imagen:

$ convert rose.jpg rose.png 

Se tiene un programa asociado que permite conversiones por lotes:

$ mogrify -format png *.jpg 

Obviamente, estas se limitan a las conversiones de imagen, pero tienen interfaces de línea de comandos interesantes.

1

El comando mmv (disponible en Debian o Fink o fácil de compilar) se creó precisamente para esta tarea. Con la solución sencilla de Bash, siempre tengo que buscar la documentación sobre la expansión variable. ¡Pero mmv es mucho más fácil de usar, muy parecido a "genialidad"!;-)

Su ejemplo sería:

mcp "template_*.txt" "foo_#1.txt" 

mmv puede manejar patrones más complejos, así y tiene algunas comprobaciones, por ejemplo, que se asegurará de que ninguno de los archivos en el conjunto de destinos aparecer en el conjunto de origen (para que no pueda sobrescribir accidentalmente los archivos).

3

Mi forma preferida:

for f in template_*.txt 
do 
    cp $f ${f/template/foo} 
done 

El "yo-no-recordar-la-sustitución-sintaxis" manera:

for i in x y z 
do 
    cp template_$i foo_$ 
done