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?


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.