web-dev-qa-db-ja.com

最後にいくつかのファイル拡張子が付いたすべてのファイルをリストしますか?

_.fas_で終わるファイルが必要な場合は、lsコマンドで次のことを実行できることを知っています。

_ls -l /users/jenna/bio/*.fas
_

そして、これは_.fas_で終わるすべてのファイルをリストします。しかし、どうすれば_.fas_または_.pep_で終わるファイルを取得できますか?

ls -l /users/jenna/bio/(*.fas | *.pep)が動作しないようです?これを行うことができる他のコマンドがあるかもしれませんが、それをlsで動作させる方法はありますか?

助けてくれてありがとう!

4
Jenna Maiz

これを使って: ls -l /users/jenna/bio/*.{fas,pep}

またはこれ:find /users/jenna/bio -iname '*.pep' -or -iname '*.fas'

5
Mikhail Krutov

箱から出して動作する可能性が最も高いのは ブレース展開 です。 bash、zsh、kshで動作します。

_ls -l /users/jenna/bio/*.{fas,pep}
_

(ブレースの周りにスペースはありません。)

Bashとkshでは、拡張子の1つが一致しない場合にエラーが表示されますが、他の拡張子に一致するファイルが一覧表示されます。この理由は、中かっこ展開はワイルドカードマッチング機能ではなく、テキストによる置換です。シェルがパターンに一致するファイルの検索を開始する前に、_*.{fas,pep}_が_*.fas *.pep_に変換されます。 zshでは、エラーが発生してコマンドが実行されませんが、「または」 glob pattern のようなより良い方法があります。一致する拡張子がない場合、これはエラーになりません。

_ls -l /users/jenna/bio/*.(fas|pep)
_

または、パターンも 別の構文 で使用できます:@(…|…); bashでは、この構文は_shopt -s extglob_でアクティブにする必要があり、zshでは、この構文は_setopt ksh_glob_でアクティブにする必要があります。

_ls -l /users/jenna/bio/*.@(fas|pep)
_

(この動作の一部は構成できます。明示的に指定されていない限り、すべてのステートメントはシェルのデフォルト構成に適用されます。)

煩わしいエラーなしで再帰的にスキャンしたい場合、通常findまたはlsから取得します(例: "Permission denied "、" ディレクトリではありません ")スクリプトまたはxargsコマンド、またtreeコマンドはここでは言及されていません。

tree -fai / | grep -e ".fas$" -e ".pep$"

上記では、ルート/、ただし任意のパスを使用できます。

tree -fai /users/jenna/bio/ |  grep -e ".fas$" -e ".pep$""

ちなみに

1