ファイル名を含むサンプル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.csv
1行に1つのファイル名またはパス名を含むと仮定します。