Script Shell pour déplacer tous les fichiers des sous-dossiers dans le dossier parent

50

J'ai un tas de dossiers dans le dossier A. Je veux déplacer des fichiers de tous ces dossiers vers A.

Ou

Je veux couper tous les fichiers des dossiers enfants et les coller dans le dossier parent.

Comment faire ça?

Rahul Virpara
la source
1
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.

Tuminoïde
la source
1
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:

  1. Vous voulez le faire de manière récursive (dans les sous-dossiers et sous-dossiers de ces sous-dossiers)
  2. Vous voulez ignorer le déplacement du fichier de script
  3. Vous avez les autorisations pour déplacer les fichiers dans ce dossier
  4. 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.

Luis Alvarado
la source
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.
Luis Alvarado