foldername
またはtest
というatest
フォルダ内のすべてのファイルを一覧表示したいと思いますbtest
。
私の最初の反応はプレーすることでしたls ./foldername/*.{a,b,}test
拡張機能にコンテンツがない場合は正常に動作しますatest
。この場合、エラーが発生しますzsh: no matches found: ./foldername/*.atest
。
このエラーを無視して存在するファイルを印刷する方法はありますか?
zsh と Bash の両方で動作するために必要です。
答え1
存在する
ls -d ./foldername/*.{a,b,}test
{a,b,...}
グローバル演算子ではない、これは中括弧拡張であり、まず次に拡張されます。
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
各 glob は個別に拡張され、一致しない glob がある場合は、期待どおりにコマンドがキャンセルされますzsh
(またはfish
同様の動作のオプションを取得する必要bash
があります)。failglob
ここでは、これらすべてのファイルと一致する単一のglobを使用し、そのglobがどのファイルとも一致しない場合にのみコマンドをキャンセルしようとします。
ls -d ./foldername/*.(a|b|)test
nullglob
単一のglobマッチがないかのように使用したくなく、ls
引数なしで実行されるため、現在のディレクトリが一覧表示されます。cshnullglob
一致しないglobを削除しますが、すべてのglobが一致しない場合はまだコマンドをキャンセルするので、これに関連してより良いです。
あなたはそれを使用したくないでしょう。なぜなら、それはあなたに恥ずかしいnonomatch
物品の破損行為をもたらすからです。bash
とinの両方で機能するglobの代替案では、zsh
ksh glob(inとin)bash
を使用できます。set -o kshglob
zsh
shopt -s extglob
bash
次に、次の操作を行います。
ls -d ./foldername/*.@(a|b|)test
または:
ls -d ./foldername/*.?([ab])test
矛盾があるときにglobがそのまま渡されるのを防ぐには、このfailglob
オプションを追加してください。bash
ls
バラよりnullglobがデフォルトではないのはなぜですか?より多くの情報を知りたいです。
答え2
次のことをお勧めしますfind
。
find ./foldername -maxdepth 1 -name '*.atest' -o -name '*.btest' -o -name '*.test'
答え3
私はこの問題に直面し、まずls自体をハックして解決しました。この作業を終えた後、必要なのは単純なCプログラムだけであることに気づきました。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
struct stat statbuf;
int i;
for( i=1; i<argc; i++ ) {
if( stat(argv[i],&statbuf) == 0 ) {
printf("%s\n",argv[i]);
}
}
}
これと必要な作業はすべて、コマンドライン引数を実行し、有効なファイル(たとえば、stat()が成功したファイル)に対応する文字列を再エコーすることです。
もちろん、同じ単純なPython、Perl、またはstatを実行するシェル関数を使用してそれらをシミュレートできますが、Cで書くとはるかに速く実行されます。
lsハッキングについては私の個人的なwikiで実行しました。http://linux.chalisque.net/LsIgnoreMissing
答え4
@DopeGhotiのコメントが私にとって効果的でした。
つまり、次のように演算子を/dev/null
使用するようにエラーをリダイレクトします。2>
ls ./foldername/*.{a,b,}test 2> /dev/null