ディレクトリにbashスクリプトがあります./
。このディレクトリには次のファイルが含まれていますoutput
。output
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/*.txt
output/
.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
設定できます(使用)。これにより、上記のループが一度だけ実行されるのを防ぐことができます(非拡張モードを使用)。nullglob
shopt -s nullglob
output/*.txt
$pathname
dotglob
ディレクトリの隠し名前を一致させるには、シェルオプションを設定する必要があるかもしれません。
答え2
zsh
代わりに使用してくださいbash
:
print -rC1 -- output/*.*(N:t:r)
その中で、 olumn に対応するprint -rC1 --
パラメータ aw を印刷して有効にするr
ために使用されるglob修飾子(一致するファイルがない場合はglobは空白に拡張されます)、ファイル(目次セクションの削除)、および拡張子です。1
C
(N:t:r)
N
nullglob
:t
:r
t
r
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
おおよその隠しファイルが含まれています。