Puede utilizar -exec
y {}
características de la orden find
por lo que no necesita ningún tubo en todo: ''
find -maxdepth 1 -type d -name "*.y" -mtime +`expr 2 \* 365` -exec mv "{}" "{}.old" \;
también que no es necesario especificar ruta: esta es la predeterminada para find
. Y usaste barras adicionales en "*.y"
. Por supuesto, si sus nombres de archivo realmente no contienen comillas.
Para ser justos, debe tenerse en cuenta que la versión con while read
es la más rápida propuesta aquí. Aquí están algunas mediciones ejemplo:
$ 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
Creo que es porque find
y xargs
invoca/bin/sh adicional (en realidad exec(3)
lo hace) cada vez para ejecutar un comando, mientras que la cáscara while
bucle no lo hacen.
UPD: Si su versión de busybox fue compilado sin soporte -exec
opción para el comando find
entonces el bucle while
o xargs
, sugirió en las otras respuestas (one, two), es su camino.
¿Cuál es el \ "sobre? Eso le diría a find para listar los archivos llamados exactamente' "* .y" '(las comillas se pasarán para encontrar y mientras que * se expandirá por shell, no encontrará nada y pasó a través de todos modos), que sin duda existe. –
Entre las diversas opciones de tiempo de compilación para busybox están 'CONFIG_FEATURE_FIND_PRINT0',' CONFIG_FEATURE_FIND_EXEC', 'CONFIG_FEATURE_FIND_EXEC_PLUS' - los enfoques funcionarán o no, dependiendo de los detalles de cómo se compiló * su * copia. –