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

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

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

答え2

zsh代わりに使用してくださいbash

print -rC1 -- output/*.*(N:t:r)

その中で、 olumn に対応するprint -rC1 --パラメータ aw を印刷して有効にするrために使用されるglob修飾子(一致するファイルがない場合はglobは空白に拡張されます)、ファイル(目次セクションの削除)、および拡張子です。1 C(N:t:r)Nnullglob:t:rtr

D 隠しファイルを含めるには、glob修飾子を追加してください。この場合、隠しファイルに拡張子があることを確認するため*.*にに変更する必要があります。?*.*

どのシェルでも使用しますが、GNU実装を使用し、関心のあるすべてbasenameのファイルが隠されておらず、.txt拡張子があり、output少なくとも1つの対応するファイルが含まれており、ファイルのリストが大きすぎて超過できないとします。execve()args+env のサイズ制限を超えない場合は、次のこともできます。

basename -as.txt output/*.txt

具体的にはbash、(GNUシェル)とGNU実装を使用して、sed次のこともできます。

(
  shopt -s dotglob nullglob
  printf '%s\0' output/?*.* |
    LC_ALL=C sed -z 's:.*/::; s/\.[^.]*$//' |
    tr '\0' '\n'
)

zshおおよその隠しファイルが含まれています。

関連情報