Script de shell para mover todos los archivos desde subcarpetas a la carpeta principal

50

Tengo un montón de carpetas en la carpeta A. Quiero mover archivos de todas esas carpetas a A.

O

Quiero cortar todos los archivos de las carpetas secundarias y pegarlos en la carpeta principal.

¿Como hacer eso?

Rahul Virpara
fuente
1
Realmente no he probado que esto sea infalible ni nada, pero ¿has intentado simplemente ingresar este comando desde la Carpeta A en una terminal mv */* .:?
Marty Fried
¿Estás seguro de que no hay nombres de archivo duplicados?
jippie
mv */* .no moverá archivos de la subcarpeta de subcarpetas.
Rahul Virpara
@jippie sí, no hay nombres duplicados
Rahul Virpara

Respuestas:

83

Ve a tu Adirectorio y ejecuta

find . -mindepth 2 -type f -print -exec mv {} . \;

lo que significa "encontrar todos los archivos en este directorio y sus subdirectorios y ejecutar mv con el directorio de destino. para cada archivo encontrado para moverlos al directorio actual.

Tuminoide
fuente
1
También intenta mover archivos que ya están en el directorio padre.
Rahul Virpara
virpara: ahora esta edición olvida todos los archivos en directorios .dot. Lo revisé con -mindepth 2 en su lugar para suprimir las advertencias.
Tuminoide
1
Con GNU findpuedes ser un poco más elegante y no generar un mvproceso para cada archivo:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster
David, tu versión funciona hasta que alcanzas el límite máximo de longitud de la línea de comando, lo cual no es tan difícil de hacer, dado que find imprime las rutas, especialmente en el caso de que lo invoques desde un directorio que no sea A, como en tu ejemplo.
Tuminoide
99
Esto es muy peligroso Si tiene archivos con el mismo nombre de archivo en diferentes subcarpetas, sobrescribirá todos estos con la última búsqueda. Mejor usar mv con --backup = numerado:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo
4

Bueno, podría crear un archivo y llamarlo "cutme" (para crear un archivo llamado cutme en el tipo de terminal nano cutme. Para guardarlo, presione CTRL + X y luego presione ENTER.) Por ejemplo y pegue lo siguiente asumiendo que:

  1. Desea hacer esto de forma recursiva (en subcarpetas y subcarpetas de esas subcarpetas)
  2. Desea omitir mover el archivo de script
  3. Tiene permisos para mover los archivos en esa carpeta
  4. Los archivos pueden o no incluir espacios en sus nombres

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Tenga en cuenta el nombre cutme dentro de la línea. Debe ser el mismo que el script que ejecutará.

Después de crear el archivo y pegar la línea anterior, ejecute lo siguiente en la misma carpeta que el script:

chmod +x cutme. Esto dará a su nuevo archivo de la bandera "ejecutable" para que pueda ejecutarlo así: ./cutme.

Luis Alvarado
fuente
¿Por qué debería intentar mover archivos que ya están en el directorio principal?
Rahul Virpara
Ejecutarías el script desde dentro de la carpeta. Cada archivo que contenga, si está dentro de una subcarpeta o no, se movería a la carpeta principal de la carpeta. La carpeta principal aquí es la principal en relación con el lugar donde se encuentra el script. En realidad, al cambiar los últimos 2 puntos, puede saber dónde mover todos los archivos dentro de una carpeta donde ejecuta el script.
Luis Alvarado