¿Cómo mover solo los archivos de la carpeta actual a una subcarpeta?


9

No tengo que mover las carpetas, solo los archivos.

Lo he intentado mv *pero este comando también mueve las carpetas.

Respuestas:


13

Si desea mover todo excepto los directorios de $SOURCE_DIRa $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
    • También podría usarlo -type fsi 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)

2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +sería más seguro (en caso de $TARGET_DIRque no haya directorio o la coincidencia comience -) y más eficiente (porque no genera un nuevo subproceso para cada archivo coincidente).
David Foerster

@DavidFoerster Gracias, actualizado (¡también aprendí algo nuevo hoy!)
Frxstrem

5

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 mvpor cp.

find . -type f -exec mv {} $TARGET \;

si explico esto, find . -type fsignifica seleccionar todos los archivos y -exec mv {} $TARGET \;ejecutar el mvcomando para todos los elementos seleccionados.


La respuesta anterior tiene un error ... también contiene mvtodos los archivos dentro de los subdirectorios. La solución rápida es el uso -maxdepth 1. Entonces no recursivamente mvarchivos dentro de subdirectorios. A continuación se muestra la correcta.

find . -maxdepth 1 -type f -exec mv {} $TARGET \;

¡No creo que el interlocutor quiera esto! También movería todos los archivos en cualquier subdirectorio al mismo directorio de destino. El -type fno previene la recurrencia.
Martin Thornton

@ MartinThornton gracias por su sugerencia ..
editaré

3

Enfoque de Python

Cuando se trata de archivos de forma recursiva, findes el camino a seguir. En este caso particular, no es necesario, pero se puede usar con -maxdepth 1otras 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

Cómo funciona esto:

  • 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 flcrea 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 flla 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

Aquí hay otro enfoque de Python
jfs el

3

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.


1
Como David Forester señaló en mi respuesta, 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!
Frxstrem 01 de

2

Para mover todo excepto los directorios de un source-dirdirectorio 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))

Ver Ejecutar archivo Python en la Terminal .


@SergiyKolodyazhnyy No veo tal requisito en pep-8 y (según el ejemplo allí) es exactamente lo contrario: import mypackageantesfrom mypackage import ...
jfs

@SergiyKolodyazhnyy no confunda las from __future__importaciones especiales y las from pathlibimportaciones ordinarias .
jfs

Sí, parece que he leído mal esa parte. No, tiene razón, import moduledebe ser el primero (que es la biblioteca y las importaciones de terceros) from module import objectdebe ser el último (local / biblioteca específica)
Sergiy Kolodyazhnyy

0

Yo usaría

mv *.*

esto funcionará siempre que sus carpetas no tengan extensiones.

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.