8
votes

Alternatives à Xargs -l

Je veux renommer un tas de DiRs de Dir to Dir.old. Idéalement, j'utiliserais ce qui suit:

find . -maxdepth 1 -type d -name \"*.y\" -mtime +`expr 2 \* 365` -print0 | xargs -0 -r -I file mv file file.old


2 commentaires

Qu'est-ce que le \ "à propos? Cela indiquerait à trouver des fichiers de liste appelés exactement " *. Y " (les citations seront transmises à la recherche et pendant que le * sera développé par Shell, il ne trouvera rien et passé de toute façon), que je doute d'exister.


Parmi les différentes options de compilération pour achabusbox sont config_featu_find_print0 , config_featu_find_exec , config_freature_find_exec_plus - les approches seront ou ne fonctionneront pas en fonction des détails de exactement comment votre copie a été compilée.


3 Réponses :


1
votes

Une alternative consiste à utiliser une boucle: xxx


1 commentaires

Lire utilise la nouvelle ligne comme séparateur. Soit vous avez besoin lu -0 (mais je ne suis pas sûr qu'il soit implémenté dans Busybox) ou si vous avez besoin de -Print .



3
votes
  1. Utilisez un pour code> boucle. Malheureusement, je ne pense pas que Busybox comprend lu -0 code> non plus, de sorte que vous ne pourrez pas gérer correctement les nouvelles lignes. Si vous n'avez pas besoin de, il est plus facile de simplement: p>

    find . -maxdepth 1 -type d -name \"*.y\" -mtime +`expr 2 \* 365` -print0 | xargs -0 -r -n 1 sh -c 'mv -- "$0" "$0".old'
    
  2. Utilisez un sh -c code> comme commande. Notez l'utilisation légèrement étrange de 0 $ code> pour nommer le premier argument (ce serait normalement le nom du script et qui va à 0 $ 0 code> et pendant que vous supprimez le script avec - C code>, l'argument passe toujours à 0 $ code>) et l'utilisation de -n 1 code> pour éviter le lot. p>

    find . -maxdepth 1 -type d -name \"*.y\" -mtime +`expr 2 \* 365` -print | while read file; do mv -- "$file" "$file".old; done
    


1 commentaires

Bupérer ne comprend même pas l'impression0. Mais votre boucle while fonctionne



12
votes

Vous pouvez utiliser -exec code> et {} code> de la commande Rechercher code> de sorte que vous n'avez pas besoin de tuyaux du tout:

$ cat measure 
#!/bin/sh
case $2 in
  1) find "$1" -print0 | xargs -0 -I file echo mv file file.old ;;

  2) find "$1" -exec echo mv '{}' '{}.old' \; ;;

  3) find "$1" | while read file; do
       echo mv "$file" "$file.old"
     done;;
esac
$ time ./measure android-ndk-r5c 1 | wc
   6225   18675  955493
real    0m6.585s
user    0m18.933s
sys     0m4.476s
$ time ./measure android-ndk-r5c 2 | wc
   6225   18675  955493
real    0m6.877s
user    0m18.517s
sys     0m4.788s
$ time ./measure android-ndk-r5c 3 | wc
   6225   18675  955493
real    0m0.262s
user    0m0.088s
sys     0m0.236s


7 commentaires

+1: La commande de recherche est livrée avec l'option -exec . C'est un peu plus lent que xargs car il exécute la commande pour chaque fichier trouvé. Mais cela fonctionne, et il n'a pas WhitSpace , car la coque n'est pas impliquée. Si vous ne pouvez pas utiliser xargs en raison de problèmes blancheurs, utilisez -exec . Les boucles sont tout aussi inefficaces que le paramètre -exec car ils s'exécutent une fois pour chaque fichier, mais ont les problèmes blancheurs que xargs ont.


xargs exécute également la commande pour chaque fichier dans ce cas afin que trouve n'est pas plus lent.


Tu as raison. Je n'ai pas regardé le commandement. Normalement, vous utilisez Xargs au lieu de -exec car Xargs combine autant de fichiers que possible sur la ligne de commande et exécute la commande que quelques fois.


tort; C'est parce que Trouver et EXED ne gèrent pas les coquilles, vous devez donc exécuter / bin / echo pour chaque fichier. Si nous modifions le script à utiliser / bin / echo, le temps est comparable aux deux premières options; Ajout d'une option Rechercher "1 $" -PRINTF "MV% P% p.old \ n" fonctionne plus vite que l'écho intégré.


Cela ne fonctionne pas comme écrit, car Busybox ne prend pas en charge l'option -exec à trouver. L'approche de la boucle tandis que Publié par Jan Hudec travaille sur BupéraBox


@DAVIDW., RE: "plus lent", -exec ... {} + se comporte tout comme Xargs (en termes de minimisation du nombre d'invocation), et fait partie de la norme POSIX pour < Code> Trouver depuis 2006.


Dans l'option Busybox '-exec', la prise en charge est configurable lors de la compilation, tout comme la commande 'Trouver' elle-même. Mise à jour de la réponse.