2017-03-16 7 views
1

を使用してファイルから、現在のディレクトリ内のファイルの存在を比較:私はコンテンツとファイルfiles.txtを持つシェルスクリプト

F1.txt 
F2.txt 
F3.txt 
F4.txt 

私はラインで、ファイルfiles.txtラインを読み、そしてかどうかを確認する必要があります出力は、私は簡単なシェルスクリプト次のように使用している

F1.txt16032017 
F2.txt16032017 
F3.txt16032017 
F4.txt16032017 

になるよう、それは、私は、files.txtのラインのそれぞれの終わりに日付を追加する必要がない場合には、カレントディレクトリに存在します。

#!/bin/bash 
DT=`date +%d%m%Y` 
while IFS=read -r line 
do 
if [ -f $line] 
then 
echo "$line$DT" > files.ok 
else 
echo "$line" > files.notok 
fi 
done < files.txt 

エラーなしで実行されますが、日付の付いた出力は期待されません。ファイルの存在テストが正しい

答えて

2

であれば誰かがを作成し、ファイルの書き込みオペレーター>が成功するたびにケースに新しいファイルを作成して問題がある、あなたはが追加>>演算子を使用している必要があります教えてもらえます既存のファイルに追加します。

あなたのコードに非常にすっきりアプローチは

  1. は ``バッククォートを使って時代遅れのコマンド置換構文を削除私は、スクリプトを改善するためになされた更新、

    #!/bin/bash 
    
    dateToday="$(date +%d%m%Y)" 
    
    while IFS= read -r file; do 
        [ -f "$file" ] && printf "%s\n" "$file$dateToday" >> files.OK || printf "%s\n" "$file" >> files.NOK 
    done < files.txt 
    

    を行うことであろうと、それらを実行するために$(..)を使用しました。

  2. 変数を二重引用符で囲んで、ローカル変数を小文字にします。
  3. >から>>
  4. にファイル書き込み演算子を修正はtest ([])オペレータのリターンコードを利用して、単一の回線状態を使用します。 [ -f "$file" ]の場合は&&以降のコマンドが実行され、条件が満たされない場合は||以降のコマンドが実行されます。
+0

ありがとうInian。それは私のために働く。私は別のポイントをここに追加していませんでした。私は現在のディレクトリの存在チェック中にファイルの日付/タイムスタンプを追加しようとしていました。私はwhileループの中で以下のコードを使用しました:DT = "$(ls -lrt $ file | awk -F" "'{print $ 6 $ 7 $ 8}')"これで、 "files.ok"ファイルに日付が追加されることはありません。アドバイス。 – Petryanu

+0

私はそれを今得ました。私は=の間にスペースを入れなければならなかった。今それは働いた。あなたの助けをたくさんありがとうInian。 – Petryanu

関連する問題