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
3 Réponses :
Une alternative consiste à utiliser une boucle:
Lire Code> utilise la nouvelle ligne comme séparateur. Soit vous avez besoin
lu -0 code> (mais je ne suis pas sûr qu'il soit implémenté dans Busybox) ou si vous avez besoin de
-Print code>.
Utilisez un 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'
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
Bupérer ne comprend même pas l'impression0. Mais votre boucle while fonctionne
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
+1: La commande de recherche est livrée avec l'option -exec code>. C'est un peu plus lent que
xargs code> car il exécute la commande pour chaque fichier trouvé. Mais cela fonctionne, et il n'a pas WhitSpace i>, car la coque n'est pas impliquée. Si vous ne pouvez pas utiliser
xargs code> en raison de problèmes blancheurs, utilisez
-exec code>. Les boucles sont tout aussi inefficaces que le paramètre
-exec code> car ils s'exécutent une fois pour chaque fichier, mais ont les problèmes blancheurs que
xargs code> ont.
xargs code> exécute également la commande pour chaque fichier dans ce cas afin que
trouve code> n'est pas plus lent.
Tu as raison. Je n'ai pas regardé le commandement. Normalement, vous utilisez Xargs au lieu de -exec code> 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" code> 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 ... {} + code> se comporte tout comme Xargs (en termes de minimisation du nombre d'invocation), et fait partie de la norme POSIX pour < Code> Trouver code> 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.
Qu'est-ce que le \ "à propos? Cela indiquerait à trouver des fichiers de liste appelés exactement
" *. Y " code> (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 code>,
config_featu_find_exec code>,
config_freature_find_exec_plus code> - les approches seront ou ne fonctionneront pas en fonction des détails de exactement comment votre copie i> a été compilée.