Bashスクリプトで拡張子のないファイルを選択するには?

Bashスクリプトで拡張子のないファイルを選択するには?

現在のディレクトリにxinitrc、Alphabetsoup、ieat.pieファイルがあるとします。 xinitrcとAlphabetsoupのみを選択するには、bashスクリプトが必要です。

答え1

bash拡張globは、名前に何もないファイル+([^.])と一致します。.設定を解除しないでくださいshopt extglob(最新のbashインストールではデフォルト値である必要があります)。このモードの意味は次のとおりです。

以下を除く任意の数(ただし少なくとも1つ)の文字.

すべてのファイル名を配列に入れることができます。

NO_EXTENSION=( +([^.]) )

ファイル名を印刷できます。

printf "%s\n" +([^.])

または、すべてユーティリティに渡します。

ls -- +([^.])

配列ではなく変数に保存するには、ファイル名にスペースが含まれていないことを確認する必要があります。これを確実に確信している場合は、次のようにすることができます。

NO_EXTENSION=$(echo +([^.]))

配列の場合とは異なり、パス名拡張を実装するにはechoを呼び出す必要があります。ファイル名の特殊文字について心配する必要はないので、これらのリストには配列を使用することをお勧めします。

答え2

次のコマンドを使用して、名前にピリオドがない作業ディレクトリのファイルの一覧を取得できます。

find . -maxdepth 1 ! -name "*.*"

.fileと一致する場合はUNIXでファイルを持つこともできますが、fileそうでないfile.ext場合は次のようになります。

find . -maxdepth 1 ! -name "*.*" -o -name ".*[^.]*"

答え3

とともにextglobオプションつまり、パターンの補完、つまり名前がパターンと一致しないファイルと一致することがあります。拡張子を持つファイルはファイルと一致するため、*.*現在のディレクトリに拡張子がないファイルは次のように一致できます。

shopt -s extglob
somecommand !(*.*)

.ドットファイル(名前で始まるファイル)は含まれていません。また、一致し、2番目の項目を含まない限り、拡張なしで処理するには、.次のようにします。

shopt -s extglob nullglob
somecommand !(*.*) .!(*.*)

または

shopt -s dotglob extglob
somecommand !(?*.*)

答え4

おそらくあなたはこれを探しているでしょう:

$ ls | grep -v '\.'

例:

$ ls
alphabetsoup  ieat.pie  xinitrc
$ ls | grep -v '\.'
alphabetsoup
xinitrc

関連情報