您可以使用命令的-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 (实际上是这样做的),而 shellfind
循环xargs
则不会。exec(3)
while
更新:如果您的busybox版本是在不-exec
支持该find
命令的选项的情况下编译的,那么while
循环或xargs
,在其他答案(一,二)中建议,是您的方式。