私のMacには、現在の場所のサブフォルダにあるtxtファイルを繰り返すスクリプトがあります。これはmyscript.sh
:
cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt
do
echo $entry
done
*txt
/Users/Desktop/txt/*.txt
これは、.txtファイルを繰り返すように、その中に含まれるパス文字列を印刷するので、echo $entry
txtファイルの名前を印刷することを期待していましたが、代わりに印刷されます。/Users/Desktop/txt/*.txt
ベストアンサー1
ファイル名と一致しない globbing パターンをシェルに指定すると、globbing パターンは拡張されません。あなたの場合、これはecho
出力パターン自体を繰り返すことを意味します。
スクリプトの代替実装:
cd /Users/Desktop || exit 1
for entry in txt/*.txt; do
test -e "$entry" && echo "$entry"
done
失敗した場合、この実装はゼロ以外の終了コードで終了しますcd
。それではそうです。いいえpwd
必要がないため使用されます。パターンに一致する名前のリストを取得し、名前を繰り返します。各反復で、その名前を標準出力に印刷する前に、その名前のエントリがファイルシステムに実際に存在することを確認するためにテストします。
echo
lop内の出力ファイルへのフルパスが必要な場合は、lopを使用するか、echo "/Users/Desktop/$entry"
より良い方法を使用してください。
dir="/Users/Desktop"
cd "$dir" || exit 1
for entry in txt/*.txt; do
test -e "$entry" && printf '%s/%s\n' "$dir" "$entry"
done