Respuestas:
Si desea mover todo excepto los directorios de $SOURCE_DIR
a $TARGET_DIR
, puede usar este comando:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
Explicado en detalle:
find
: La búsqueda de búsqueda de archivos en un directorio$SOURCE_DIR
: El directorio para buscar-maxdepth 1
: No mirar dentro de subdirectorios-not -type d
: Ignorar directorios
-type f
si solo desea copiar cosas que son estrictamente archivos, pero prefiero lo anterior porque también captura todo lo que no es ni un archivo ni un directorio (en particular enlaces simbólicos)-exec mv -t "$TARGET_DIR" -- '{}' +
: Ejecute el comando mv -t "$TARGET_DIR" -- FILES...
donde FILES...
están todos los archivos coincidentes (gracias @DavidFoerster)Creo que solo quiere mover sus archivos. Primero vaya a su directorio y use este comando, reemplace $ TARGET con su ruta de directorio de destino. Si desea copiar sus archivos, reemplácelos mv
por cp
.
find . -type f -exec mv {} $TARGET \;
si explico esto, find . -type f
significa seleccionar todos los archivos y -exec mv {} $TARGET \;
ejecutar el mv
comando para todos los elementos seleccionados.
La respuesta anterior tiene un error ... también contiene mv
todos los archivos dentro de los subdirectorios. La solución rápida es el uso -maxdepth 1
. Entonces no recursivamente mv
archivos dentro de subdirectorios. A continuación se muestra la correcta.
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type f
no previene la recurrencia.
Cuando se trata de archivos de forma recursiva, find
es el camino a seguir. En este caso particular, no es necesario, pero se puede usar con -maxdepth 1
otras respuestas.
El comando simple de Python también puede hacerlo. Aquí hay un ejemplo:
$ tree
.
├── a_directory
└── a_file
$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];
> map(lambda x:shutil.move(x,'./a_directory'),fl)"
$ tree
.
└── a_directory
└── a_file
1 directory, 1 file
fl=[f for f in os.listdir('.') if os.path.isfile(f)]
itera sobre todos los elementos que os.listdir('.')
encuentra y probamos si el elemento es un archivo que utiliza la os.path.isfile()
función.
Una vez que se fl
crea la lista de archivos, utilizamos la map()
función. Esta función toma dos argumentos: una función y una lista de elementos; realizará la función que le dimos por cada archivo en una lista. Por lo tanto, aquí tenemos una lambda x:shutil.move(x,'./a_directory')
función anónima que moverá un archivo dado a un directorio dado, y luego tenemos fl
la lista de archivos que creamos.
Para facilitar la lectura y el uso general, también podríamos reescribir esto como un script general de Python, que toma dos argumentos: directorio de origen y subdirectorio de destino.
#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv
# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ]
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
move(i,argv[2])
Y el uso es así:
$ tree
.
├── a_directory
├── a_file
└── files2subdir.py
1 directory, 2 files
# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"
$ tree
.
├── a_directory
│ └── a_file
└── files2subdir.py
Si está usando zsh en lugar de bash, puede hacer esto:
mv "$SOURCE"/*(.) "$TARGET"
Al (.)
final se llama calificador global; el .
interior significa específicamente que solo coincida con los archivos normales.
Hacer un mv *(.) "$target"
es rápido y práctico. Sin embargo, si está haciendo esto como parte de un script, es posible que desee considerar escribir algo como lo que sugirieron Frxstrem y David Forester mv -t "$target" -- *(.)
, para manejar mejor los casos de esquina que pueden surgir en el uso de otras personas.
mv -t "$TARGET" -- "$SOURCE"/*(.)
sería más seguro (en caso de que "$TARGET"
comience con -
un directorio o no). ¡Sin embargo, me gusta la solución zsh!
Para mover todo excepto los directorios de un source-dir
directorio a otro destination-dir
, en Python:
#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path
if len(sys.argv) != 3:
sys.exit(__doc__) # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
if not path.is_dir():
shutil.move(str(path), str(dest_dir / path.name))
import mypackage
antesfrom mypackage import ...
from __future__
importaciones especiales y las from pathlib
importaciones ordinarias .
import module
debe ser el primero (que es la biblioteca y las importaciones de terceros) from module import object
debe ser el último (local / biblioteca específica)
Yo usaría
mv *.*
esto funcionará siempre que sus carpetas no tengan extensiones.
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
sería más seguro (en caso de$TARGET_DIR
que no haya directorio o la coincidencia comience-
) y más eficiente (porque no genera un nuevo subproceso para cada archivo coincidente).