Je veux trouver des fichiers et les déplacer.
Je peux trouver le fichier avec:
$ find /tmp/ -ctime -1 -name x*
J'ai essayé de les déplacer dans mon ~/play
répertoire avec:
$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/
mais cela n'a pas fonctionné. Evidemment mv a besoin de deux arguments.
Vous ne savez pas si (ou comment) référencer l'élément actuel de xargs dans la commande mv?
-I
:find . | xargs -I'{}' mv '{}' ~/play/
, mais comme homme dit que « Implique-x
et-L 1
. » Donc , pas de gain. Mieux vaut rester simple et utiliserfind . -exec mv '{}' ~/play/ \;
Réponses:
Regardez la réponse de Stéphane pour la meilleure méthode, regardez ma réponse pour des raisons de ne pas utiliser les solutions les plus évidentes (et les raisons pour lesquelles elles ne sont pas les plus efficaces).
Vous pouvez utiliser l'
-I
option dexargs
:Qui fonctionne dans un mécanisme similaire à
find
et{}
. Je citerais également votre-name
argument (car un fichier commençant parx
dans le répertoire actuel serait globalisé et passé en argument à rechercher - ce qui ne donnera pas le comportement attendu!).Cependant, comme l'a souligné Manatwork, comme détaillé dans la
xargs
page de manuel:La chose importante à noter est que cela
-L 1
signifie qu'une seule ligne de sortiefind
sera traitée à la fois. Cela signifie que c'est syntaxiquement le même que:(qui exécute une seule
mv
opération pour chaque fichier).Même en utilisant l'
-0
argument GNU xargs et l'find -print0
argument provoque exactement le même comportement de-I
- il s'agit d'clone()
un processus pour chaque fichiermv
:la source
Avec les outils GNU:
L' option
-t
(--target
) est spécifique à GNU.-print0
,-r
,-0
, Tandis que les non-standard et originaires de GNU se trouvent également dans d'autres implémentations comme sur certains BSDs.POSIX:
Les deux exécutent aussi peu de
mv
commandes que nécessaire et fonctionnent quels que soient les caractères que les noms de fichiers peuvent contenir. Le GNU peut avoir l'avantage defind
continuer à chercher des fichiers tout enmv
commençant à déplacer le premier lot.Attention, tous les fichiers et répertoires se retrouveront dans un seul répertoire, attention aux conflits si plusieurs fichiers dans des répertoires différents portent le même nom.
la source
mv
une fois pour tous les arguments (ou pour tout-L
ou-n
, si fourni). Sinon, appelermv
pour chaque fichier vieillira (et ralentira) rapidement.Peut-être que cette commande est possible maintenant et n'était pas de retour en 2013, mais cela fonctionne parfaitement pour moi:
La
-t
clé place le dossier de destination en premier, libérant lamv
commande pour avoir tous les derniers arguments comme juste les fichiers à déplacer.la source
Vous pouvez essayer avec la commande ci-dessous et testé et cela a bien fonctionné
la source