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.
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:
Desea hacer esto de forma recursiva (en subcarpetas y subcarpetas de esas subcarpetas)
Desea omitir mover el archivo de script
Tiene permisos para mover los archivos en esa carpeta
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.
mv */* .
:?mv */* .
no moverá archivos de la subcarpeta de subcarpetas.Respuestas:
Ve a tu
A
directorio y ejecutalo 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.
fuente
find
puedes ser un poco más elegante y no generar unmv
proceso para cada archivo:find A -mindepth 2 -type f -exec mv -t A \{\} +
find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
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: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
.fuente