ピリオドを含むサブディレクトリのファイル名を繰り返しますが、パスとファイル拡張子は除外します。

ピリオドを含むサブディレクトリのファイル名を繰り返しますが、パスとファイル拡張子は除外します。

ディレクトリにbashスクリプトがあります./。このディレクトリには次のファイルが含まれていますoutputoutput

Alabama.txt
U.S. Virgin Islands.txt

ファイルを繰り返してoutput次の出力を印刷する方法

Alabama
U.S. Virgin Islands

ベストアンサー1

for pathname in output/*.txt; do
    basename "$pathname" .txt
done

このbasenameユーティリティはパス名を取得し、すべてのディレクトリ部分を削除し、最終ファイル名部分のみを残します。また、オプションの2番目の引数として文字列を受け入れます。文字列は、指定されたパス名の末尾で切り捨てられます。

パス名の一部を削除し、ファイル名のサフィックスを削除するには、basenameすべての名前の一致にループを使用します。これにより、出力ファイル名の「ステム」のみが残ります。output/*.txtoutput/.txt

組み込みの標準パラメータ置換を使用して同じ効果を得ることができます。

for pathname in output/*.txt; do
    name=${pathname#output/}
    printf '%s\n' "${name%.txt}"
done

これは、拡張された各パス名に対して2つのパラメータ置換を実行しますoutput/*.txt。 1 つは最初の部分output/文字列を削除し、2 番目は末尾の部分.txt文字列を削除します。

outputディレクトリにファイル名サフィックスが含まれているファイルがない危険性がある場合は、シェルオプションを.txt設定できます(使用)。これにより、上記のループが一度だけ実行されるのを防ぐことができます(非拡張モードを使用)。nullglobshopt -s nullgloboutput/*.txt$pathname

dotglobディレクトリの隠し名前を一致させるには、シェルオプションを設定する必要があるかもしれません。

おすすめ記事