一時ファイル内のファイル名を変数として使用して、ディレクトリ内のファイル名を見つけることができません。

一時ファイル内のファイル名を変数として使用して、ディレクトリ内のファイル名を見つけることができません。

ファイル名を含むサンプルCSVファイルがあります。

f1
f2
f3

ディレクトリからこのファイル名を検索したいと思います。以下のコードは次のとおりです。

while read f1
do
  ls -t | grep "$f1"
  if[ $? = 0 ]
  then
    echo file exists
  else 
    echo file does not exists
  fi

done<sample.csv

どういうわけか$f1変数値は空の値を取得することに代わるものではありません。

ベストアンサー1

このlsコマンドは、ファイルが存在するかどうかをテストするのではなく、ディレクトリの内容を一覧表示します。また、通常、grepファイル名の操作には適していません。これは、ファイル名に技術的に改行文字を含めることができるためです(そして、grepテキストファイルを使用するほとんどのユーティリティと同様に、行ベースのツールであるため)

また、テストに構文エラーがありますif(先行スペースがありません[)。

コメントによると、入力ファイルもDOSテキストファイルです。これは、ファイルから読み取った各行の末尾に追加のキャリッジリターンがあることを意味します。これは、Unixスクリプト(または他のUnixツール)がファイルを読み取るときにキャリッジリターンが読み取ったデータの一部になることを意味します。 。この特定のスクリプトでは、これはファイルから読み取られたファイル名がファイルシステムの既存のファイル名と一致する可能性がほとんどないことを意味します(キャリッジリターンは実際にはUnixファイル名で動作しますが、エラーに加えて他のファイル名はほとんどまたはまったく見られませんでした)なし)。

変換ユーティリティを使用して、DOSテキストファイルをUnixテキストファイル形式に変換できますdos2unix


ファイルが存在するかどうかをテストするには、-e次のテストを使用します[ ... ]

while IFS= read -r name; do
    if [ -e "$name" ]; then
        printf '%s exists\n' "$name"
    else
        printf '%s does not exist\n' "$name"
    fi
done <sample.csv

これは、ファイルがsample.csv1行に1つのファイル名またはパス名を含むと仮定します。

おすすめ記事