Je n'ai pas vraiment testé cette possibilité, mais avez-vous simplement essayé d'entrer cette commande à partir du dossier A dans un terminal mv */* .:?
Marty Fried
Êtes-vous sûr qu'il n'y a pas de noms de fichiers en double?
Jippie
mv */* .ne déplace pas les fichiers du sous-dossier des sous-dossiers.
Rahul Virpara
@jippie ouais, il n'y a pas de doublons de noms
Rahul Virpara
Réponses:
83
Allez dans votre Arépertoire et lancez
find .-mindepth 2-type f -print -exec mv {}. \;
ce qui signifie "trouver tous les fichiers de ce répertoire et de ses sous-répertoires et exécuter mv avec le répertoire cible. pour chaque fichier trouvé, pour les déplacer dans le répertoire en cours.
il essaie également de déplacer les fichiers qui se trouvent déjà dans le répertoire parent.
Rahul Virpara
virpara: cette édition oublie maintenant tous les fichiers des répertoires .dot. Révisé avec -mindepth 2 à la place pour supprimer les avertissements.
Tuminoïde
1
Avec GNU, findvous pouvez être un peu plus élégant et ne pas générer de mvprocessus pour chaque fichier:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster
David, votre version fonctionne jusqu’à ce que vous atteigniez la limite maximale de longueur de ligne de commande, ce qui n’est pas si difficile étant donné que find imprime les chemins, en particulier si vous l’appelez à partir d’un répertoire autre que A, comme dans votre exemple.
Tuminoïde
9
C'est très dangereux. Si vous avez des fichiers portant le même nom de fichier dans différents sous-dossiers, vous écraserez tous ces éléments lors de la dernière recherche. Mieux vaut utiliser mv avec --backup = numéroté:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo
4
Vous pouvez bien créer un fichier et le nommer "cutme" (pour créer un fichier appelé cutme dans le type de terminal nano cutme. Pour l’enregistrer, appuyez sur CTRL + X puis sur ENTRÉE.) Et collez le texte suivant en supposant que:
Vous voulez le faire de manière récursive (dans les sous-dossiers et sous-dossiers de ces sous-dossiers)
Vous voulez ignorer le déplacement du fichier de script
Vous avez les autorisations pour déplacer les fichiers dans ce dossier
Les fichiers peuvent ou non inclure des espaces dans leurs noms
find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;
Notez le nom cutme à l'intérieur de la ligne. Il devrait être identique au script que vous allez exécuter.
Après avoir créé le fichier et collé la ligne ci-dessus, exécutez ce qui suit dans le même dossier que le script:
chmod +x cutme. Cela vous donnera votre nouveau fichier le drapeau « Executable » de sorte que vous pouvez l' exécuter comme ceci: ./cutme.
Pourquoi devrais-je essayer de déplacer des fichiers qui sont déjà dans le répertoire parent?
Rahul Virpara
Vous exécuteriez le script depuis l'intérieur du dossier. Chaque fichier qu'il contient, que ce soit à l'intérieur d'un sous-dossier ou non, serait déplacé vers le dossier parent du dossier. Le dossier parent ici est le parent par rapport à l'endroit où se trouve le script. En fait, en modifiant les 2 derniers points, vous pouvez indiquer où déplacer tous les fichiers d'un dossier dans lequel vous exécutez le script.
mv */* .
:?mv */* .
ne déplace pas les fichiers du sous-dossier des sous-dossiers.Réponses:
Allez dans votre
A
répertoire et lancezce qui signifie "trouver tous les fichiers de ce répertoire et de ses sous-répertoires et exécuter mv avec le répertoire cible. pour chaque fichier trouvé, pour les déplacer dans le répertoire en cours.
la source
find
vous pouvez être un peu plus élégant et ne pas générer demv
processus pour chaque fichier:find A -mindepth 2 -type f -exec mv -t A \{\} +
find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
Vous pouvez bien créer un fichier et le nommer "cutme" (pour créer un fichier appelé cutme dans le type de terminal
nano cutme
. Pour l’enregistrer, appuyez sur CTRL + X puis sur ENTRÉE.) Et collez le texte suivant en supposant que:find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;
Notez le nom cutme à l'intérieur de la ligne. Il devrait être identique au script que vous allez exécuter.
Après avoir créé le fichier et collé la ligne ci-dessus, exécutez ce qui suit dans le même dossier que le script:
chmod +x cutme
. Cela vous donnera votre nouveau fichier le drapeau « Executable » de sorte que vous pouvez l' exécuter comme ceci:./cutme
.la source