Bashでディレクトリの最初のファイルを取得する方法は? 1つ目は、シェルグローブが最初に探すことです。
Bashでディレクトリの最初のファイルを見つけたとき、私は次のことを見つけました:古い投稿非常に具体的な要件があります。私は一般的な問題に対する私の解決策を子孫のために文書化し、人々に共有したい代替解決策を提示する場所を提供したいと思います。
答え1
現在のディレクトリの最初のファイルをインポートするには、拡張子を配列に配置して最初の要素をインポートできます。
files=(*)
echo "${files[0]}"
# OR
echo "$files" # since we are only concerned with the first element
現在のディレクトリに複数のディレクトリが含まれていると仮定すると、次のように繰り返して最初のファイルをインポートできます。
for dir in *; do
files=($dir/*)
echo "${files[0]}"
done
ただし、シェル設定によってはfiles=(*)
ファイルが存在しない場合は、1つの要素(「*」など)を含む配列が返されることがあります。したがって、配列のファイル名が存在する実際のファイルと一致することを確認する必要があります(そしてこれが*
有効なファイル名であることを忘れないでください)。
答え2
既存のすべての回答は最初にディレクトリの完全なリストを生成するように見え、何千もの要因のために時間がかかる可能性があるため、単に次のように終了しました。
ls -AU | head -1
ここでは-U
ソートされていないことを意味するため、結果はすぐに生成されます。
答え3
存在するzsh
:
- ロケールのソート順で隠されていない最初のファイル:
first=(*(N[1]))
- 同じですが、ディレクトリではないファイルにのみ適用されます。
first=(*(N^/[1]))
- 同じですが、ディレクトリへのシンボリックリンクも除外されます。
first=(*(N^-/[1]))
- 限られた定期的な文書:
first=(*(N.[1]))
- 同じですが、通常のファイルへのシンボリックリンクが含まれています。
first=(*(N-.[1]))
追加の注:
- これらは大量に変数はまだ保存できる必要があるため変える要素数:0(一致するファイルなし)または1(最初の項目のみを選択した一致するファイル)の代わりにスカラー変数を定義するには
$first
(一致するファイルがない場合は空の文字列を含むように)、(){ first=$1; } *(N[1])
次のようにします。または、$first
一致するファイルがない場合は、スカラー変数を変更せずに残します(){ (($#)) && first=$1; } *(N[1])
。 - 隠しファイルを含めるには、
D
glob修飾子を追加してください。 - 一部のロケール(たとえば、2020年現在のGNUシステムで一般的に使用されているほとんどのロケールを含む
en_US.UTF-8
)では、一部の文字が等しくソートされているため、照合は必ずしも決定的ではありません。たとえば、次を参照してください。touch
答え4
ディレクトリの最初の一般的なファイル名を取得するには、次を使用できます。
shopt -s nullglob dotglob
unset -v name
for name in some/path/*; do
[ -f "$name" ] && break
unset -v name
done
このループの後、$name
通常ファイルの名前が最初にソートされるか、ディレクトリに通常ファイルがない場合は変数が設定解除されますsome/path
。
ここで使用されるシェルオプションは、nullglob
パターンが一致しない場合にループが実行されないようにし()、隠された名前も一致させます(dotglob
)。
ファイル名グロービングパターンがアルファベット順に並べられたリストに展開されたため、名前が取得されます。