2012-10-11 36 views
5

Este título es un poco confuso, así que déjame desglosarlo. Básicamente tengo un directorio completo de archivos con varios nombres y extensiones:¿Cómo uso Bash para crear una copia de un archivo con un sufijo adicional antes de la extensión?

MainDirectory/ 
    image_1.png 
    foobar.jpeg 
    myFile.txt 

Para una aplicación para iPad, tengo que crear copias de los mismos con el sufijo @ 2X añade al final de todos estos nombres de archivo , antes de la extensión - por lo que iba a terminar con esto:

MainDirectory/ 
    image_1.png 
    [email protected] 
    foobar.jpeg 
    [email protected] 
    myFile.txt 
    [email protected] 

en lugar de cambiar los nombres de los archivos de uno en uno con la mano, quiero crear una secuencia de comandos para cuidar de él para mí. Actualmente tengo lo siguiente, pero no funciona como se esperaba:

#!/bin/bash 

FILE_DIR=. 

#if there is an argument, use that as the files directory. Otherwise, use . 
if [ $# -eq 1 ] 
then 
    $FILE_DIR=$1 
fi 

for f in $FILE_DIR/* 
do 
    echo "Processing $f" 
    filename=$(basename "$fullfile") 
    extension="${filename##*.}" 
    filename="${filename%.*}" 
    newFileName=$(echo -n $filename; echo -n [email protected]; echo -n $extension) 
    echo Creating $newFileName 
    cp $f newFileName 
done 

exit 0 

que también quieren mantener esta fiesta a puro, y no depender de las llamadas específicas del OS. ¿Qué estoy haciendo mal? ¿Qué puedo cambiar o qué código funcionará para hacer lo que necesito?

Respuesta

6
#!/bin/sh -e 
cd "${1-.}" 

for f in *; do 
    cp "$f" "${f%.*}@2x.${f##*.}" 
done 
+0

trabajado como un encanto! Gracias – Phil

+1

no sabía sobre #, ##,% y %% - ¡muy útil, gracias! más aquí http://tldp.org/LDP/abs/html/string-manipulation.html – ahmedre

1

Es muy fácil de hacer eso con awk en una línea como la siguiente: (.) ​​

ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' | sh 

con ls -1 se obtiene sólo la simple lista de archivos, entonces tubería awk utilizar el punto como separador Luego construyes un comando de shell para crear una copia de cada archivo.

Sugiero ejecutar el comando sin la última tubería sh antes, para comprobar que los comandos cp son correctos. De esta manera:

ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' 
Cuestiones relacionadas