特定の文字で終わるファイルを見つけるには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