问题描述
我有bash脚本,目的是查找所有早于“ X”分钟的文件,并将输出重定向到文件中。逻辑是有一个for循环,我想对所有文件进行查找,但是由于某种原因,它只打印并重定向输出文件中的文件,只是最后一个目录中的文件(TESTS [3] =“ / tmp / test / ”)。所以我希望目录中的所有文件都重定向到那里。谢谢您的帮助:D
这是嘘:
#!/bin/bash
set -x
if [ ! -d $TEST ]
then
echo "The directory does not exist (${TEST})!"
echo "Aborted."
exit 1
fi
TESTS[0]="/tmp/t1/"
TESTS[1]="/tmp/t2/"
TESTS[2]="/tmp/t3/"
TESTS[3]="/tmp/test/"
for TEST in "${TESTS[@]}"
do
find $TEST -type f -mmin +1 -exec ls -ltrah {} \; > /root/alex/out
done
解决方法
您每次在循环内使用>
将最新命令的输出重定向到文件,覆盖文件的先前内容。如果您使用>>
,则每次都会以“附加”模式打开文件,但是...
解决问题的更好方法是将重定向移到循环外:
done > /root/alex/out
一种比这更好的方法是完全避免循环并仅使用:
find "${TESTS[@]}" -type f -mmin +1 -exec ls -ltrah {} \; > /root/alex/out
由于find
接受多个路径。
我认为您可以使用{} +
而不是{} \;
来调用处理所有参数所需的最少数量ls
,并且您可能想在{中检查-printf
{1}},因为您可能无需使用man find
就可以使用内置格式说明符获得类似的输出。