0

シェルスクリプトの行数が「n」を超えるファイルを選択して、別のディレクトリに移動しようとしています。

次のコマンドは、コマンドラインからは正常に機能しますが、シェルスクリプトでは機能しません。

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

しかし、シェルスクリプトの場合、

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 に答える