拡張子を無視して文字で終わるファイルを検索するには、ls を使用します。

拡張子を無視して文字で終わるファイルを検索するには、ls を使用します。

特定の文字で終わるファイルを見つけるにはlsを使用する必要がありますが、ファイルに拡張子があるかどうかは重要ではありません。

たとえば、このようにしたいです。

> ls test test.txt test.ascii other.txt

> ls [something] test test.txt test.ascii

これにより、「t」で終わるファイルは見つかりますが、拡張子がtで終わるファイルは見つかりません。

編集:ファイル名の唯一のピリオド文字は拡張子用であり、他の文字はないと仮定する必要があります。

答え1

何か=

 |grep -e ".*t\.[^.]*" -e "^[^.]*t$"

答え2

bashシェルを使用している場合は、このextglobオプションを使用して複雑なフィルタリングを実行できます。たとえば、

解決策:

bash$ shopt -s extglob

bash$ ls
other.txt  test  test.ascii  test.txt

bash$ ls *@(t.*|[^.]?[[:alnum:]]t)
test  test.ascii  test.txt

説明する:

PATTERN1 は(t.*)「t」で終わり、ファイル拡張子の後に続くすべてのファイルと一致します。

bash$ ls *@(t.*)
test.ascii  test.txt

PATTERN2は、([^.]?[[:alnum:]]t)ピリオドがなく、その後にゼロ個以上の英数字が続き、「t」で終わるすべてのファイルと一致します。ファイル拡張子のないファイルと一致します。

bash$ ls *@([^.]?[[:alnum:]]t)
test

このグロブは@(PATTERN1|PATTERN2)すべてのパターンと一度だけ一致します。結合されたパターンは、私たちが探しているものだけをフィルタリングします。

Bashモードの詳細については、以下を参照してください。http://wiki.bash-hackers.org/syntax/pattern

答え3

1つのドット(拡張子)を持つファイルが必要で、
現在のディレクトリ(./)から検索する必要があると仮定すると、次のようになります。

$ find . -maxdepth 1 -type f -regex './[^.]*t\(\.[^.]*\)?'
./test.txt
./test.ascii
./test

これはうまくいきますが、ディレクトリを含みます(ファイル名に改行があると失敗します)。

$ printf '%s\n' * | grep -e ".*t\.[^.]*" -e "^[^.]*t$"
test
test.ascii
test.txt
tt

改行文字を含むファイル名を許可するには、(GNU grep)を使用します。

$ printf '%s\0' * | grep -ze ".*t\.[^.]*" -e "^[^.]*t$" | xargs -0
test test.ascii test.txt tt

関連情報