在shell脚本中选择包含多于“n”行的目录中的文件?

时间:2012-10-23 10:25:02

标签: shell awk find xargs

我正在尝试选择shell脚本中行数超过'n'的文件并将它们移动到另一个目录。

以下命令可以从命令行运行,但不能在ashell脚本中运行,

MY_PATH='/var/www/'
find $MY_PATH -maxdepth 1 -type f -name 'authuser-*' | xargs  wc -l |   awk '{if($1 >= 5) print $1}

但是在shell脚本中,

files_count=`find $MY_PATH -type f  -name 'authuser-*' | xargs  wc -l | awk '{if($1 > 5) print $2}'`
echo $files_count
exit 1

我目前正在使用此完整命令

find /var/www/ -maxdepth 1 -type f -name 'authuser-*'| xargs  wc -l |   awk '{if($1 >= 5) print $2}' | awk '{if($1 !="total") print $1}' | xargs -i basename {} | head -$5 

可能是什么问题?还有其他解决办法吗?

4 个答案:

答案 0 :(得分:3)

实际上我认为你投入太多的管道命令来完成一项简单的工作。考虑这一点,选择行数大于5的所有文件:

 find /var/www/ -maxdepth 1 -type f -name 'authuser-*' \
                    -exec awk 'END {if (NR > 5) print FILENAME}' {} \;

答案 1 :(得分:1)

您是否在脚本中设置了 PATH? PATH='/var/www/'

否则,您的脚本将使用系统的PATH变量而不是您设置的PATH。除此之外,我不明白为什么你的命令 如果从命令行执行,则无法在脚本中运行。

此外,您不应使用PATH来设置自定义路径。你可以选择 例如,MY_PATH之类的其他名称。

答案 2 :(得分:1)

似乎你正在使它变得比必要的复杂得多:

n=5
for file in authuser-*
do
    (( $(wc -l <"$file") > "$n" )) &&
    mv "$file" wherever...
done

请注意,上面将处理名称中带有空格的文件,这与使用文件列表填充变量的任何解决方案都不同。

答案 3 :(得分:0)

问题在于使用find命令:

find "$MY_PATH" -type f  -name 'authuser-*'
你错过了双引号。 顺便说一句,下面的脚本在我的位置工作。

#!/bin/sh
mypah='./'
var=`find "$mypah" -name "temp" | xargs nawk '{a[FILENAME]++}END{for(i in a){if(a[i]>5)print i}}'`

echo $var