0

我正在尝试在 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

4 回答 4

3

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

 find /var/www/ -maxdepth 1 -type f -name 'authuser-*' \
                    -exec awk 'END {if (NR > 5) print FILENAME}' {} \;
于 2012-10-23T11:04:37.483 回答
1

似乎你让它变得比必要的复杂得多:

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

请注意,与使用文件列表填充变量的任何解决方案不同,上述方法可以很好地处理名称中带有空格的文件。

于 2012-10-23T13:03:04.060 回答
1

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

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

此外,您不应该PATH用于设置自定义路径。例如,您可以选择不同的名称MY_PATH

于 2012-10-23T10:34:29.247 回答
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
于 2012-10-23T12:10:21.977 回答