È possibile utilizzare -exec
e {}
caratteristiche del comando find
quindi non è necessario alcun tubi a tutti:
find -maxdepth 1 -type d -name "*.y" -mtime +`expr 2 \* 365` -exec mv "{}" "{}.old" \;
Inoltre non è necessario specificare '' percorso: impostazione predefinita per find
. E hai utilizzato delle barre aggiuntive in "*.y"
. Ovviamente se i nomi dei file non contengono realmente citazioni.
A dire il vero va notato che quella versione con ciclo while read
è la più veloce proposta qui. Qui ci sono alcune misure di esempio:
$ 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
Penso che sia perché find
e xargs
invoca aggiuntive/bin/sh (in realtà exec(3)
lo fa) ogni volta per eseguire un comando, mentre la Shell while
ciclo non lo fanno.
Upd: Se la versione busybox è stato compilato senza il supporto -exec
opzione per il comando find
poi il ciclo while
o xargs
, suggerito nelle altre risposte (one, two), è il tuo modo.
fonte
2012-01-06 14:40:37
Qual è il \ "circa? Che direbbe find per elencare i file chiamati esattamente' "* .y" '(le virgolette saranno passate per trovare e mentre * sarà espanso dalla shell, non troverà nulla e passerà comunque), che dubito esistano. –
Tra le varie opzioni di compilazione per busybox ci sono 'CONFIG_FEATURE_FIND_PRINT0',' CONFIG_FEATURE_FIND_EXEC', 'CONFIG_FEATURE_FIND_EXEC_PLUS' - gli approcci funzioneranno o meno a seconda dei dettagli di come * la * copia è stata compilata. –