Copiar archivos con múltiples extensiones

22

Me gustaría copiar archivos con múltiples extensiones en un solo directorio de destino.

Por ejemplo, puedo usar el siguiente comando para copiar todos los archivos .txt en el directorio de trabajo a un directorio llamado destination:

cp -v *.txt destination/

Y puedo usar lo siguiente para copiar todos los directorios .png en el directorio de trabajo a destination:

cp -v *.png destination/

Pero lleva mucho tiempo escribirlos como comandos separados (incluso con el uso del historial de comandos). Así que, ¿hay alguna manera de que yo puedo decir cpque copiar los archivos, ya sea con el patrón *.txt o el patrón *.pnga destination? Idealmente, me gustaría ser capaz de especificar más de dos patrones - como instruir cpa copiar todo *.txt o *.png o *.jpg archivos a destination, por ejemplo.

Estoy seguro de que todo esto es posible usando un script de shell, estoy usando bash, por ejemplo, pero ¿hay alguna manera de lograrlo de manera más simple, solo desde la consola? ¿Podría de alguna manera usar la expansión de llaves para hacerlo?

Sé que es posible copiar todos los archivos en el directorio de trabajo, excepto aquellas que coinciden con ciertos patrones específicos , pero desde mi directorio de trabajo contiene muchos más extensiones de archivo que yo no quiero copiar a los que yo hago , que sería un dolor.

¿Tienes alguna idea sobre esto?

Andrés
fuente
10
cp -v *.txt *.png destination/?
iruvar

Respuestas:

56

La expansión de llaves hará el trabajo. man bashy buscar Brace Expansion.

cp *.{txt,jpg,png} destination/

EDITAR:

De acuerdo con la solicitud del OP, al comando anterior le faltaba la opción detallada:

cp -v *.{txt,jpg,png} destination/
Timothy Martin
fuente
2
¿Puedo hacer esto en Windows?
sergiol
Si lo hago cp data/images/*.{jpg,jpeg,png,mp4} destination/y mp4no existe un archivo, aparece un No such file or directoryerror que rompe el script. ¿Puedo hacer que las múltiples extensiones manejen con gracia los formatos faltantes?
BradGreens
1
@BradGreens Realmente debería publicar una nueva pregunta en lugar de preguntar aquí en los comentarios. Su pregunta puede incluso tener una respuesta ya. Publicar una nueva pregunta no solo le dará una respuesta, sino que también será buscada por otras personas que necesiten la misma ayuda.
Timothy Martin
0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

Eso está funcionando!

Ofek Ortal
fuente