¿Cómo puedo mover archivos por tipo de forma recursiva desde un directorio y sus subdirectorios a otro directorio?


30

¿Cuál sería una buena manera de mover un tipo de archivo desde un directorio y todos sus subdirectorios?

Como "mover todo * .ogg in / thisdir recursivamente a / somedir". Probé un par de cosas; mi mejor esfuerzo fue (todavía no tan bueno):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

Regresó en cada línea antes de cada nombre de archivo,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

Respuestas:


23

puedes usar find con xargs para esto

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

El -I en el comando anterior le dice a xargs qué cadena de reemplazo desea usar (de lo contrario, agrega los argumentos al final del comando).

O
En su comando, simplemente intente mover '{}' después del mvcomando.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;


1
no olvide hacer una copia de seguridad antes de intentar los comandos anteriores :-).
Hemant

2
Por cierto, para el primer -print0 para encontrar y -0 para xargs se debe utilizar como sea posible, para evitar espacios en blanco en los problemas de nombre de archivo.
maxschlepzig

@maxschlepzig: buen punto. Voy a editar
Hemant

2
Recomiendo encarecidamente usar mv -iaquí, por lo que no se arriesga a sobrescribir archivos si sucede algo inesperado.
Gilles 'SO- deja de ser malvado'

2
con mv de gnu core utils puedes usar mv -t <targetdir>y + en lugar de \;


9

En zsh o bash 4, para reunir todos los *.oggarchivos en /somedir:

mv /thisdir/**/*.ogg /somedir

Si desea reproducir la jerarquía de directorios: (advertencia, escrita directamente en el navegador)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

más que conveniente en bash
Mark
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.