Saltar al contenido

Mueva archivos recursivamente de cierto tipo y mantenga su estructura de directorios

Deseamos proponerte la mejor respuesta que hemos encontrado por todo internet. Esperamos que te sirva de ayuda y si quieres compartir algún detalle que nos pueda ayudar a perfeccionar nuestra información hazlo libremente.

Solución:

Depende un poco de su O/S y, más particularmente, de las instalaciones en su versión de tar y si tienes el mando cpio. También depende un poco de si tiene líneas nuevas (en particular) en los nombres de sus archivos; la mayoría de la gente no lo hace.

Opción 1

cd /old-dir
find . -name '*.mov' -print | cpio -pvdumB /new-dir

Opcion 2

find . -name '*.mov' -print | tar -c -f - -T - |
(cd /new-dir; tar -xf -)

los cpio El comando tiene un modo de transferencia (copiar) que hace exactamente lo que desea dada una lista de nombres de archivo, uno por línea, en su entrada estándar.

Algunas versiones de la tar el comando tiene una opción para leer la lista de nombres de archivos, uno por línea, desde la entrada estándar; en MacOS X, esa opción es -T - (donde el solitario - significa ‘entrada estándar’). Por el primero tar comando, la opción -f - significa (en el contexto de escribir un archivo con -c, escribe en la salida estándar); en el segundo tar comando, el -x opción significa que el -f - significa ‘leer desde la entrada estándar’.

Puede haber otras opciones; mire la página del manual o la salida de ayuda de tar con bastante cuidado.

Este proceso copia los archivos en lugar de moverlos. La segunda mitad de la operación sería:

find . -name '*.mov' -exec rm -f  +

Al ser archivos grandes, si están en el mismo sistema de archivos, no desea copiarlos, sino simplemente replicar su estructura de directorios mientras los mueve. Puedes usar esta función:

# moves a file (or folder) preserving its folder structure (relative to source path)
# usage: move_keep_path source destination
move_keep_path () 
  # create directories up to one level up
  mkdir -p "`dirname "$2"`"
  mv "$1" "$2"

O agregando soporte para fusionar directorios existentes:

# moves a file (or folder) preserving its folder structure (relative to source path)
# usage: move_keep_path source destination
move_keep_path ()  while read file; do
      # call recursively for all files inside
      mv_merge "$file" "$2/`basename "$file"`"
    done
    # remove after merge
    rmdir "$1"
  else
    # either file or non-existing folder
    mv "$1" "$2"
  fi

ASSERT: Ningún archivo tiene caracteres de nueva línea. Los espacios, sin embargo, están AOK.

# TEST FIRST: CREATION OF FOLDERS
find . -type f -iname *.mov -printf '%hn' | sort | uniq | xargs -n 1 -d 'n' -I '' echo mkdir -vp "/TARGET_FOLDER_ROOT/"

# EXECUTE CREATION OF EMPTY TARGET FOLDERS
find . -type f -iname *.mov -printf '%hn' | sort | uniq | xargs -n 1 -d 'n' -I '' mkdir -vp "/TARGET_FOLDER_ROOT/"

# TEST FIRST: REVIEW FILES TO BE MOVED
find . -type f -iname *.mov -exec echo mv  /TARGET_FOLDER_ROOT/ ;

# EXECUTE MOVE FILES
find . -type f -iname *.mov -exec mv  /TARGET_FOLDER_ROOT/ ;

Reseñas y calificaciones del post

Agradecemos que desees respaldar nuestro ensayo poniendo un comentario y puntuándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *