J'ai plusieurs fichiers dans plusieurs dossiers dans un répertoire qui doivent être dans un dossier. Existe-t-il une ligne de commande qui puisse m'aider à accomplir cela?
Utilisation de find
+ xargs
+ mv
:
find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .
Cela déplacera tous les fichiers du répertoire de travail en cours et de ses sous-répertoires (de manière récursive) dans le répertoire de travail en cours, en numérotant numériquement les fichiers portant le même nom afin d'éviter les écrasements de fichiers portant le même nom.
Exemple de résultat sur un dossier tmp
avec un sous-dossier 1
, 2
et 3
contenant chacun un 1.ext
, 2.ext
et 3.ext
fichier:
ubuntu@ubuntu:~/tmp$ tree
.
├── 1
│ ├── 1.ext
│ ├── 2.ext
│ └── 3.ext
├── 2
│ ├── 1.ext
│ ├── 2.ext
│ └── 3.ext
└── 3
├── 1.ext
├── 2.ext
└── 3.ext
3 directories, 9 files
ubuntu@ubuntu:~/tmp$ find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .
ubuntu@ubuntu:~/tmp$ tree
.
├── 1
├── 1.ext
├── 1.ext.~1~
├── 1.ext.~2~
├── 2
├── 2.ext
├── 2.ext.~1~
├── 2.ext.~2~
├── 3
├── 3.ext
├── 3.ext.~1~
└── 3.ext.~2~
3 directories, 9 files
Si votre structure de répertoire ressemble à
dir root
- dir A
- déposer un
- fichier b
- dir B
- fichier c
- fichier d
etc
vous pouvez faire un simple
mv **/* .
pour déplacer tous les fichiers de la profondeur 1 vers le répertoire racine. Simple et élégant!
Vous pouvez le faire en utilisant find
:
find . -type f -exec mv -i -t new_dir {} +
Commencez par créer le répertoire (mkdir new_dir
) dans lequel vous souhaitez déplacer tous les fichiers. Ici, nous déplaçons tous les fichiers du répertoire ./new_dir
.
find . -type f
trouvera tous les fichiers sous tous les répertoires du répertoire actuel. Vous devez donc cd
dans le répertoire qui contient tous les sous-répertoires ou vous pouvez utiliser le chemin absolu, par exemple. ~/foo/bar
Le prédicat -exec
de find
exécutera la commande mv
qui déplacera tous les fichiers trouvés dans le répertoire new_dir
. Une fois encore, vous pouvez utiliser le chemin absolu.
mv -i
vous demandera de remplacer un fichier.
Si le nouveau répertoire est situé ailleurs, utilisez des chemins absolus:
find ~/path/to/dir -type f -exec mv -i -t ~/path/to/new_dir {} +
vous pouvez utiliser la commande:
find . -type f -execdir mv '{}' /parent-dir \;
man find
-execdir utility [argument ...] ;
The -execdir primary is identical to the -exec primary with the exception that
utility will be executed from the directory that holds the current
file. The filename substituted for the string ``{}'' is not qualified.