回答:
たとえば、特定のディレクトリ内のファイルを除くすべてのファイルを一覧表示するnotHere
場合は、find
コマンドを使用して次のようにすることができます
find . -path ./notHere -prune -o -type f -print
説明:
.
:開始するディレクトリfind
内を-path ./notHere
:パスに一致するルールを開始します ./notHere
-prune
:find
現在の一致でディレクトリに降りることを防ぎます-o
:を追加しor
て、最初のルールが一致しなかった場合の処理を指定します-type f
:たとえば、ディレクトリではなくファイルのみに一致します(ディレクトリエントリも表示する場合はこれを削除します)-print
:多くの場合、それはデフォルトのアクションであるため必要ありませんが、一部のバージョンではfind
、結果を出力する必要があることを明示的に伝えたい場合があります。ls -ll
ファイル名のリストだけでなく、他の出力(具体的には)が必要であることに言及しています。 find
多くの場合、これを支援する組み込み機能がありますが、の特定のオプションはありませんls
。-print
上記のフラグをに置き換えて、-ls
そのls
オプションセットが十分に近いかどうかを確認できます。
find . -path ./notHere -prune -o -type f -ls
または、それでも十分でない場合は、次のfind
ように出力を個別に処理する代わりに、必要なコマンドを実行できます。
find . -path ./notHere -prune -o -type f -exec ls -ll {} +
find
でもが持っている-ls
、あなたの代わりに使用できることを-print
。Freebsdのmanページには-ls
、ls -dgils
どちらがあなたにとって十分近いかもしれないような出力を与えると書かれています。そうしないと、置き換えることができます-print
と-exec ls -ll {} +
して、手動ですべての出力を処理しようとするよりも高速であるべきであるwhile
ループ
このスクリプトを使用して、名前が「_」で始まるすべてのフォルダーを除外します。スペースのあるフォルダではおそらく動作しませんが、修正することはできます。
#!/bin/sh
A=`ls /j/ | xargs | sed 's/_[a-z0-9]*//g' | awk '{$1=$1;print}'`
W=`echo $A | wc -w | tr -d '[[:space:]]'`
echo $W
一般的に興味深いのはこれです:
ls some_folder | xargs | sed 's/_[a-z0-9]*//g'
正規表現に_[a-z0-9]*
は、除外する名前と一致するパターンが含まれています。
これは、-a
オプション(名前のみ)なしでフォルダーを一覧表示する場合です。使用したい場合-a
、最も簡単な方法は次のとおりです。
ls -la | grep -v skip_folder
どこskip_folder
が除外する名前です。フォルダーにスペースが含まれている場合は、引用符を使用します。例:
ls -la | grep -v "skip folder"
ls -la | grep -v "skip folder"
ディレクトリ名のみを省略し、その内容は残ります。ls -ll | pcregrep --color -v -M "directoryAddress(\n|.)*nextDirectoryFullAddress"
リスト全体を省略するを使用しました。ただし、ディレクトリ構造が変更される可能性があり(つまり、別のリストがそれらの間に追加される可能性がある)、一部のデータが失われるため、これは良い答えとは見なしません。
find
場合は、パスに基づいて特定の名前をgrepで出力できるため、最適です。たとえば、次のとおりですfind . | grep -v .ssh/id_rsa
ls -ll
です。検索結果をを含むシェルスクリプトにフィードできることは知っていますが、while
非常に遅いと思います