0

スクリプトのパラメーター化されたバージョンで次のコマンドを実行しました:

Script1 as

Nooffiles=`find $1 -mmin $2 -type f -name "$3"|wc -l`
if test $Nooffiles -eq 0
then
exit 1
else
echo "Successful"
find $1 -mmin $2 -type f -name "$3" -exec mv '{}' $4 \;
fi

script1 は正常に動作します。ファイルを $1 ディレクトリから $4 に移動します。しかし、ファイルを新しいディレクトリに移動した後、次のような別のスクリプトを実行する必要があります:

Script2 as

for name in `find $1 -type f -name "$2"`
do
filename=`ls $name|xargs -n1 basename`
line=`tail -1 $filename | sed "s/Z/Z|$filename/"`
echo $line >> $3;
echo $filename | xargs -n1 basename;
done

ここで、script2 は、前のスクリプト script1 によってファイルが移動されたディレクトリから読み取っています。以前の移動スクリプトが正常に機能したため、それらはそのディレクトリに存在します。「ls」コマンドはそれらを表示します。しかし、上記の script2 は次のように述べています。

File.txt: No such file or directory

ls はそれらをディレクトリに表示しますが、このようなエラーメッセージが表示されます。

助けてください。

4

1 に答える 1

1

スクリプトは本当に混乱しているので、ファイル名を解析してはいけないことに注意してください(からの出力のようにls、またはオプションfindなしで)。Bashの落とし穴#1-print0を参照してください。

それとは別に、問題は、ループ内で、から出力されたファイル名を切り捨ててからfind、ベースファイル名を引数としてbasename呼び出しtail、ファイルが実際には現在のフォルダーにないことだと思います。

私はあなたがそこで何をしているのか理解していませんが、これはおそらくあなたが望むものの次に行ういくつかのより正しいコードです:

find "$1" -type f -name "$2" -print0 | while read -d '' name
do
    filename=`basename "$name"`
    tail -1 "$name" | sed "s/Z/Z|$filename/" >> "$3"
    echo "$filename"
done

しかし、それでも、このスクリプトには落とし穴があります。から入力された奇妙なファイル名で失敗する可能性がありますfind。たとえば、ファイル名に。に固有の文字が含まれている場合sedです。または、ある時点$filename--helpetc.etc.etc。

于 2011-12-16T14:56:44.577 に答える