サブフォルダシェルスクリプトで特定の拡張子を持つファイルを繰り返します。

サブフォルダシェルスクリプトで特定の拡張子を持つファイルを繰り返します。

私のMacには、現在の場所のサブフォルダにあるtxtファイルを繰り返すスクリプトがあります。これはmyscript.sh

cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt 
do 
echo $entry
done

*txt/Users/Desktop/txt/*.txtこれは、.txtファイルを繰り返すように、その中に含まれるパス文字列を印刷するので、echo $entrytxtファイルの名前を印刷することを期待していましたが、代わりに印刷されます。/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必要がないため使用されます。パターンに一致する名前のリストを取得し、名前を繰り返します。各反復で、その名前を標準出力に印刷する前に、その名前のエントリがファイルシステムに実際に存在することを確認するためにテストします。

echolop内の出力ファイルへのフルパスが必要な場合は、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

おすすめ記事