1 votes

Unix déplacer/supprimer des fichiers de sous-répertoires

S'il y a plusieurs sous-répertoires dans le répertoire de travail actuel, j'aimerais déplacer uniquement certains types de fichiers ou éventuellement tout le contenu de ces répertoires vers le répertoire de travail. et ensuite ; "rmdir *" ces répertoires vides ou "rm -r" ces répertoires (s'ils ne sont pas vides).

Cela ne devrait-il pas être fait avec l'utilitaire "find", puis avec le tuyau "mv ." ? (déplacer les résultats de la recherche dans le répertoire de travail) ? Si oui, quelles sont les options de find que je dois passer par exemple, ou Quel type de commandes doit-on utiliser pour rm ou mv les fichiers dans les sous-répertoires, et peut-être supprimer les répertoires par la suite ?

Cette méthode est-elle sûre pour déplacer des noms de fichiers en double dans le même répertoire ? ou les fichiers seront-ils écrasés, s'il y a beaucoup d'index.htmls par exemple ?

Il s'agit d'une tâche de base sous Unix : mv ou rm des types de fichiers spécifiés dans plusieurs sous-répertoires.

3voto

Daniel Beck Points 105590

La procédure suivante déplace tous les fichiers HTML hors du répertoire foo et supprime les répertoires vides :

$ find foo -name '*.html' -type f -exec mv -nv "{}" '.' \;
foo/bar/1.html -> ./1.html
./1.html not overwritten
foo/baz/qux/3.html -> ./3.html
foo/baz/qux/5.html -> ./5.html
$ find foo -depth -type d -delete

Il reste des fichiers HTML avec des noms de fichiers contradictoires, des fichiers qui ne sont pas des fichiers HTML et des dossiers non vides.

Pour renommer automatiquement les fichiers afin d'éviter les noms de fichiers en double, vous pouvez utiliser l'option mktemp . La syntaxe est différente d'un système d'exploitation à l'autre, et la syntaxe ci-dessous fonctionne sous OS X et vraisemblablement sous les BSD :

find foo -name '*.html' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
foo/bar/1.html -> ./1.html.yNr
foo/baz/1.html -> ./1.html.RUu
foo/baz/qux/3.html -> ./3.html.rzu
foo/baz/qux/5.html -> ./5.html.JyW

Pour chaque fichier HTML qu'il trouve, il lance bash et lui fait exécuter la commande suivante -c qui n'est en fait qu'un mv avec un fichier créé dynamiquement (à l'aide de mktemp ) le nom du fichier de destination dans le répertoire actuel.

Pour vous assurer qu'il fonctionnera comme prévu, vous pouvez echo les mv d'abord en guise d'aperçu :

find foo -name '*.html' -type f -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
mv -v foo/bar/1.html ./1.html.VNf
mv -v foo/baz/1.html ./1.html.pCW
mv -v foo/baz/qux/3.html ./3.html.ADN
mv -v foo/baz/qux/5.html ./5.html.K3w

Comme vous pouvez le voir, chaque invocation donne lieu à un suffixe différent grâce à mktemp で、その bash script (vous ne pouvez pas inclure cette partie dans un fichier de type -exec mv car il serait évalué une fois pour le find et utiliser le même suffixe pour toutes les personnes déplacées).

En fonction du nombre de fichiers concernés, vous pouvez avoir besoin d'un suffixe aléatoire plus important que le simple .XXX .

0voto

wtfsven Points 163

Vous pouvez le faire en une seule fois avec une commande du type:\NPar exemple, il s'agit d'une commande d'une durée d'un an.

find . -name '*.goaway' -exec mv '{}' destination \;

mais il serait plus sûr de commencer par voir ce que la commande find trouve pour vous, éventuellement en l'envoyant dans un fichier que vous pouvez utiliser pour effectuer les opérations réelles.

Et oui, si vous déplacez tous vos index.html dans le même répertoire, ils s'entrechoqueront et il ne vous restera plus que le dernier à avoir été déplacé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X