Вы можете использовать -exec
и {}
особенности команды find
так что вам не нужны никакие трубы на все:
find -maxdepth 1 -type d -name "*.y" -mtime +`expr 2 \* 365` -exec mv "{}" "{}.old" \;
Также вам не нужно указать «» path - это значение по умолчанию для 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
вызывают дополнительный/бен/ш (фактически exec(3)
делает это) каждый раз, когда для выполнения команды, в то время как оболочка while
цикла нет.
Upd: Если BusyBox версия была собрана без поддержки -exec
опции для find
команды, то цикл while
или xargs
, предложенный в других ответах (one, two), это ваш путь.
Что такое «about»? Что скажет find для списка файлов, называемых точно '' * .y "' (кавычки будут переданы для поиска, а в то время как * будет расширяться оболочкой, он ничего не найдет и пройдет во всяком случае), что я сомневаюсь в существовании. –
Среди различных вариантов времени компиляции для busybox: 'CONFIG_FEATURE_FIND_PRINT0',' CONFIG_FEATURE_FIND_EXEC', 'CONFIG_FEATURE_FIND_EXEC_PLUS' - подходы будут работать или не будут работать в зависимости от того, как именно была скомпилирована ваша * копия. –