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?


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.


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.


¿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
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.