web-dev-qa-db-fra.com

Comment déplacer uniquement les fichiers du dossier actuel vers un sous-dossier?

Je n'ai pas à déplacer les dossiers, mais uniquement les fichiers.

J'ai essayé mv * mais cette commande déplace également les dossiers.

9
Archit

Si vous voulez déplacer tout sauf les répertoires de $SOURCE_DIR à $TARGET_DIR, vous pouvez utiliser cette commande:

find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +

Expliqué en détail:

  • find: recherche de fichiers dans un répertoire
  • $SOURCE_DIR: Le répertoire dans lequel effectuer la recherche
  • -maxdepth 1: Ne regardez pas dans les sous-répertoires
  • -not -type d: Ignore les répertoires
    • Vous pouvez également utiliser -type f si vous voulez uniquement copier des choses qui sont strictement des fichiers, mais je préfère ce qui précède, car il capture également tout ce qui n'est ni un fichier ni un répertoire (notamment des liens symboliques).
  • -exec mv -t "$TARGET_DIR" -- '{}' +: Exécutez la commande mv -t "$TARGET_DIR" -- FILES...FILES... sont tous les fichiers correspondants (merci @DavidFoerster)
12
Frxstrem

Je pense que vous ne voulez mv que vos fichiers. Commencez par aller dans votre répertoire et utilisez cette commande, remplacez $ TARGET par votre chemin de répertoire cible. Si vous souhaitez copier vos fichiers, remplacez mvpar cpname__.

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

si j’explique cela, find . -type f signifie sélectionner tous les fichiers et -exec mv {} $TARGET \; signifie exécuter la commande mvà tous les éléments sélectionnés.


La réponse précédente a une erreur .. il mvtous les fichiers dans les sous-répertoires également. La solution rapide est d'utiliser -maxdepth 1. Ensuite, il récursivement mvfichiers dans les sous-répertoires. Ci-dessous, le bon.

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

Approche python

Lorsque vous traitez des fichiers de manière récursive, findest la solution. Dans ce cas particulier, ce n'est pas nécessaire, mais peut être utilisé avec -maxdepth 1 comme le montrent d'autres réponses.

La simple commande python peut également le faire. Voici un exemple:

$ 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

Comment ça marche:

  • fl=[f for f in os.listdir('.') if os.path.isfile(f)] itère sur tous les éléments que os.listdir('.') trouve et nous testons si l'élément est un fichier utilisant la fonction os.path.isfile().

  • Une fois la liste de fichiers flcréée, nous utilisons la fonction map(). Cette fonction prend deux arguments - une fonction et une liste d'éléments. il remplira la fonction que nous lui avons donnée pour chaque fichier de la liste. Donc ici, nous avons lambda x:shutil.move(x,'./a_directory') en tant que fonction anonyme qui déplacera un fichier donné dans un répertoire donné, puis nous aurons le fl- la liste des fichiers que nous avons construits.

Pour des raisons de lisibilité et d'utilisation générale, nous pourrions également réécrire ceci sous la forme d'un script général python, qui prend deux arguments - le répertoire source et le sous-répertoire de destination.

#!/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])

Et l'usage est comme ça:

$ 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
3

Si vous utilisez zsh au lieu de bash, vous pouvez faire ceci:

mv "$SOURCE"/*(.) "$TARGET"

Le (.) à la fin s'appelle un qualificatif glob; le . à l'intérieur signifie spécifiquement de ne faire correspondre que des fichiers normaux.

Faire une mv *(.) "$target" est rapide et pratique. Cependant, si vous faites cela dans le cadre d'un script, vous voudrez peut-être envisager d'écrire quelque chose comme ce que Frxstrem et David Forester ont suggéré, mv -t "$target" -- *(.), afin de mieux gérer les problèmes qui pourraient survenir dans l'utilisation d'autres personnes.

3
JoL

Pour déplacer tout le contenu sauf les répertoires du répertoire source-dir vers le répertoire 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))

Voir Exécution de Python Fichier dans Terminal .

2
jfs

J'utiliserais

mv *.*

cela fonctionnera tant que vos dossiers n'auront pas d'extensions.

0
user669400