J'ai un répertoire que j'essaie de nettoyer qui contient à la fois des fichiers et des sous-répertoires. Ce que j'essaie de faire est simple: déplacer tous les fichiers dans un autre répertoire, mais laisser tous les sous-répertoires tels quels.
Je pense à quelque chose comme:
mv [*_but_no_dirs] ./other_directory
Il semble qu'il devrait y avoir un moyen simple de le faire avec des caractères génériques *
et des expressions rationnelles ...
Quelqu'un a des idées?
mv **/*(.) ./other_directory
- avec bash, vous devrez cependant recourir à des commandes externesfind
.Réponses:
Regex ne sont pas impliqués ici. Les caractères génériques dans bash (comme la plupart des autres shells) ne correspondent qu'aux fichiers en fonction des noms de fichier, et non en fonction du type de fichier ou d'autres caractéristiques. Il existe une façon de faire correspondre par type: l'ajout
/
à la fin du modèle ne fait correspondre que les répertoires ou les liens symboliques aux répertoires. De cette façon, vous pouvez déplacer des répertoires, puis déplacer ce qui reste, et déplacer des répertoires en arrière - lourd mais cela fonctionne.Un moyen standard de faire correspondre les fichiers par type est d'appeler
find
.Dans zsh, vous pouvez utiliser des qualificatifs glob pour faire correspondre les fichiers par type. Le
.
qualificatif correspond aux fichiers normaux; utiliser^/
pour faire correspondre tous les non-répertoires, ou-^/
pour inclure également des liens symboliques vers les répertoires.Dans n'importe quel shell, vous pouvez simplement boucler.
la source
Vous pourriez utiliser quelque chose comme
D'abord, nous utilisons
find
pour regarder uniquement dans le directoy actuel, puis nous ignorons les répertoires en utilisant! -type d
enfin nous exécutonssh
et déplaçons tout dans le répertoire de destination. Vous pourriez essayer{} +
à la fin qui sera plus rapide.la source
-exec sh -c 'mv "$@" MYDIR' _ {} \;
plutôt que-exec mv {} MYDIR \;
? Juste pour obtenir quelque chose qui peut être rationalisé en changeant le\;
en+
? Vous pouvez le faire avec le-exec mv -t MYDIR {} +
formulaire.-t
drapeau. J'ai également expliqué dans la réponse que le+
est plus rapide mais que toutes lesfind
versions ne le prennent pas en charge. Le code ci-dessus est donc à peu près compatible avec n'importe quelfind
ou shell utilisé.find
shell utilisé.» Vrai, mais il en est ainsifind … -exec mv {} MYDIR \;
, et qui utilise moins de ressources que… -exec sh -c 'mv "$@" MYDIR' _ {} \;
.C'est potentiellement un peu dangereux mais
Comme cp et rm ne fonctionneront pas sur les répertoires sans le commutateur -r.
la source
Je suggérerais simplement de faire
mv *.* destination/
avec destination / être le dossier vers lequel vous vous déplacez.la source
*.*
, certains répertoires seront déplacés et certains fichiers resteront, ce qui n'est pas ce que le demandeur voulait.la source