¿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'
Steve Burdine
fuente

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 \;

Hemant
fuente
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 \;
10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

Intercambiaste un poco los argumentos para mv

Distrito de codificación
fuente
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
Gilles 'SO- deja de ser malvado'
fuente
más que conveniente en bash
Mark