Utilisation xargs de mv un répertoire à partir des résultats de recherche dans un autre répertoire
J'ai la commande suivante:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
Cela vous permettra de déplacer le répertoire fondée vers un autre répertoire. Comment puis-je utiliser xargs
au lieu de exec
de faire la même chose.
- Pourquoi voulez-vous utiliser
xargs
au lieu de-exec
?
Vous devez vous connecter pour publier un commentaire.
Si vous avez GNU
mv
(etfind
etxargs
), vous pouvez utiliser le-t
option pourmv
(et-print0
pourfind
et-0
pourxargs
):Noter que les versions modernes de
find
(compatible avec la norme POSIX 2008) soutien+
en place de;
et se comportent à peu près le même quexargs
sans l'aide dexargs
:Ce fait
find
groupe de pratique de nombre de fichier (répertoire) les noms en une seule invocation du programme. Vous n'avez pas le niveau de contrôle sur le nombre d'arguments passés àmv
quexargs
offre, mais il est rare que vous en ayez réellement besoin de toute façon. Encore des charnières sur le-t
option pour GNUmv
.mv
arguments inversé)-t
option? Il est suivi par le nom du répertoire cible, ce qui signifie que le dernier argument n'est pas la cible après tout, permettant ainsi exactement ce utiliser avecxargs
.-t
être unxarg
argument à la place.-print0
et-0
approche fonctionne même pour les noms de fichiers qui contiennent des retours à la ligne; l'autre ne l'est pas. Accordé, plusieurs fichiers ont des retours à la ligne dans leurs noms, mais le point du nul de la notation, c'est qu'il couvre tous les noms de fichier sans exception.Avec BSD xargs (pour OS X et FreeBSD), vous pouvez utiliser
-J
qui a été construit pour cela:Que quelque chose correspondant à
some_pattern
dans.
àtarget_location
Avec GNU xargs (pour Linux et Cygwin), l'utilisation
-I
à la place:Le obsolète
-i
option de GNU xargs implique-I{}
et peut être utilisé comme suit:Noter que BSD xargs a aussi un
-I
option, mais qui fait quelque chose d'autre.find . -name some_pattern | xargs -I % mv % target_location
. Mercitrouver:
avec l'option
-print0
, la sortie de fin avec '\0';xargs:
avec l'option
-0
, elle sera scindée args par '\0' mais les espaces,-r
signifie pas-run-si-vide, de sorte que vous ne sera pas faire des erreurs sifind
ne pas faire de sortie. (Le-r
est une extension GNU.)J'ai l'habitude de l'utiliser dans des scripts quand je ne suis pas sûr si les fichiers existent ou pas.
find
n'est pas vraiment un bon outil pour cela. J'imagine que vous souhaitez déplacer tous les sous-répertoires dans un autre répertoire.find
va sortir des choses commeAprès
./a
est déplacé, tout d'abord, il vous suffit de faire des erreurs à propos de "no such file or directory" tous les sous-dossiers.Vous devriez utiliser
mv *//another/place
-- le slash sur le caractère restreint de l'expansion à seulement dirs.Si vous n'êtes pas à l'aide de GNU mv, vous pouvez utiliser cette commande:
sinon, voici une solution simple qui ne nécessite pas xargs:
Noter que j'ai ajouté de la profondeur, sinon vous aurez des erreurs lorsque les deux d'un répertoire et l'un de ses sous-répertoire est d'être traitées.