コマンドの機能を使用できるため-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
コマンドを実行するたびに追加の /bin/sh を呼び出す(実際にfind
は実行する)ためだと思いますが、シェルループはそうではありません。xargs
exec(3)
while
Upd:あなたの busybox バージョンがコマンド-exec
のオプションサポートなしでコンパイルされた場合、他の回答 ( one、two ) で提案されているループまたはがあなたのやり方です。find
while
xargs