Вы можете использовать -exec
и {}
функции команды find
, поэтому вам вообще не нужны никакие трубы:
find -maxdepth 1 -type d -name "*.y" -mtime +`expr 2 \* 365` -exec mv "{}" "{}.old" \;
Также вам не нужно указывать '.' путь - это значение по умолчанию для find
. И вы использовали дополнительные косые черты в "*.y"
. Конечно, если имена ваших файлов не содержат кавычек.
Справедливости ради следует отметить, что версия с while read
петлей является самой быстрой из предложенных здесь. Вот несколько примеров измерений:
$ 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
Я думаю, это потому, что find
и xargs
каждый раз для выполнения команды вызывают дополнительные / bin / sh (фактически exec(3)
делает это), в то время как оболочка while
loop этого не делает.
Upd: Если ваша версия busybox была скомпилирована без поддержки опции -exec
для команды find
, тогда цикл while
или xargs
, предложенный в других ответах ( one) , два ), это ваш путь.