したがって、私は特定のファイルが存在するかどうかを確認する方法をすでに知っています。
if [ -f ~/file1 ]; then echo "is there" ; else echo "not there" ; fi
if [ -f ~/file2 ]; then echo "is there" ; else echo "not there" ; fi
そして両方のファイルが存在する場合:
[[ -f file1 && -f file2 ]] && echo "both" || echo "not"
しかし、私が知らないのは、2つの異なるファイルが存在することを確認しながら、どちらかが存在するか、両方が存在する場合はそれぞれの名前を印刷するか、両方が存在しない場合はエラーを印刷する方法です... ...)
する:
file1は存在しますが、file2は存在しない場合 -> file1を既存のファイルとして印刷し、その逆も同様です。
file1 と file2 が存在する場合 -> 対応するファイル名を出力します。
存在しない場合 -> そのファイル名は存在しないものとして印刷されます。
答え1
私はこれを繰り返し行います:
for pathname in ~/file1 ~/file2; do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
else
printf '"%s" does not exist\n' "$pathname"
fi
done
これは、基本的にループヘッダに記載されている各パス名の存在に対して単一のテストを実行し、テスト結果に基づいて出力する内容を決定します。出力には、解決されたパス名とテスト結果が記載されています。
パス名が単純なパターンと一致する場合は、ループで使用できます。
for pathname in ~/file[12]; do ...; done
この質問は次のように解釈することもできます。既存のすべてのパス名を印刷します。ただし、ファイルが存在しない場合は、すべてのパス名と存在しないという説明が印刷されます。
set -- ~/file1 ~/file2
found=false
for pathname do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
found=true
fi
done
if ! "$found"; then
printf '"%s" does not exist\n' "$@"
fi
ここでは、確認したいパス名を含むリストとして位置引数リストを使用しています。テスト中に一度、ファイルが存在しない場合は、-e
呼び出しから再度(暗黙的に)このリストを繰り返すことができるので、これを行います。printf
代わりに配列を使用してくださいbash
(より多くの入力が必要です)。
files=( ~/file1 ~/file2 )
found=false
for pathname in "${files[@]}"; do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
found=true
fi
done
if ! "$found"; then
printf '"%s" does not exist\n' "${files[@]}"
fi
files=( ~/file1 ~/file2 )
次のように書くこともできます。
files[0]=~/file1
files[1]=~/file2
-f
テストとテストの説明です-e
。テスト-e
は存在を確認し、-f
テストは存在を確認します。そしてファイルタイプ。パス名が一般ファイル(または一般ファイルへのシンボリックリンク)を参照していない場合、テストは偽になる可能性がありますが、-f
同時に-e
テストは真になることがあります。 「一般ファイル」は、ディレクトリ、ソケット、名前付きパイプ、またはその他の一般的なUnixファイル形式ではないファイルです。
ファイル形式について言及せずに質問に「exists」という単語を繰り返し使用したので、答えのテストではなく-e
テストを選択しました。-f