Unix for ループは機能しません。

Unix for ループは機能しません。

単純なbashスクリプトがあります。過フッ化フィードバック:

CWD=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $CWD
for i in `cat req_files.txt`
do
echo "file_found : $i">a.txt
done

注:req_files.txtには、このディレクトリで見つける必要があるファイルのリストがあります。ファイルが見つかったら、見つかったファイルの名前をリストし、「a.txt」として印刷する必要があります。

req_files.txtには複数のファイルがありますが、最初のファイル名のみが印刷され、残りは印刷されません。助けてください。

答え1

繰り返すたびにa.txtの内容を上書きするようです。

echo "file_found : $i">a.txt

>と交換する必要があります>>

または、毎回開いたり閉じたりすることがないように、作業が終わったら配置します。これを他の回答に追加して提供してください。

done < req_files.txt > a.txt

今まで表示されている内容を保存する必要はないので、追加する代わりに開いたままにしておきました。

答え2

スペース/タブ/などを含む行をファイルから読み取るには、while代わりにループを使用する必要があります。for

CWD=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $CWD
while read i
do
echo "file_found : $i">a.txt
done < req_files.txt

答え3

コードには、指定されたディレクトリを検索し、そのディレクトリ内のファイルを指定されたファイル(req_files.txt)と比較する行は含まれていません。あなたがすることは、a.txtファイルとreq_files.txtファイルの内容を1つずつ上書きし続けることです(使用中であるため、追加の>演算子を使用してください)。>>A.txt。

私が理解したのは、あなたの目標は次のとおりです。

指定されたパス内のすべてのファイルを検索して一覧表示します。その後、このリストはreq_files.txtにリストされているファイルと比較されます。最後に、一致するコンテンツが出力ファイルa.txtにリストされます。この場合、以下のコードを使用してください。

cwd=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $cwd #change dir to the required path
>a.txt  # create output file a.txt
for file in `ls`:
do
        grep "`echo "$file"`" req_files.txt >> a.txt
done

forループ内で、lsコマンドを使用してファイルを一覧表示します。このスクリプトは、与えられたパスに存在する req_files.txt のファイルを含む a.txt ファイルを与えられたパス内に生成します。

答え4

ループが繰り返されるたびに出力ファイルを切り取ります(空白)。

また、出力を繰り返しています。catこれは、シェルが出力を空白、タブ、および改行(デフォルト)に分割し、結果に対してファイル名のグロービングを実行するために危険です。 1行が表示されると、*現在のディレクトリのすべてのファイル名に置き換えられます。

代わりに:

cd /cygdrive/c/Users/abhisek.samanta/Desktop/New_folder || exit 1

while IFS= read -r line; do
    printf 'File found: %s\n' "$line"
done <req_files.txt >a.txt

これはファイルから読み込み、req_files.txtループの出力を作成しますa.txta.txt出力をファイルに書き込む前に、ファイルが切り捨てられます。存在しない場合に生成されます。

あなたはしたいですか?追加既存のファイルに出力するには、代わりに>>を使用してください>

また見なさい:

関連情報