我正在尝试选择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
可能是什么问题?还有其他解决办法吗?
答案 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