"ls -R"出力からディレクトリを除外する方法は?

"ls -R"出力からディレクトリを除外する方法は?

もし

ls -aR | grep ":$"

返品

./.hiddendir2:
./dir1:
./dir3:
./dir3/.hiddendir4:

それでは、grepに提供されているパターンをどのように更新して、次のような結果のみを得ることができますか?

./dir1:
./dir3:

(親が隠されていなくても.hiddendir4を含む最後の行は省略されます。)


以下は、いくつかの文脈で同じ質問の長いバージョンです。

で素晴らしいスクリプトを見つけました。http://www.centerkey.com/tree/ディレクトリツリーを印刷するために作業していますが、作業しているリポジトリの.gitディレクトリサブエントリが原因で出力が複雑になることがあります。

ソースコードを正しく読んでいる場合は、次の行でgrepパターンを変更する必要があります。

ls -aR | grep ":$"

^\./(?!\.)\w+:$これまでテストで動作しているように見えることを思い出しました。http://regexpal.com/しかし、bashで実行しようとすると競合が発生します。この問題を解決するには、(1)私が使用している正規表現テストツールとgrepがパターンを解析する方法の違い、(2)bashエスケープ文字の要件、および(3)パターンデザインの両方を解決する必要があると思います。この問題に多すぎる時間を費やす前に助けてくれてありがとう。

答え1

file「ls -l」が提供するよりも深いディレクトリの内容を調べる必要があります。

find . -type f

このfindコマンドは古代のUnixの魔法です。無限の正規表現引数からあなたを救います。

答え2

ディレクトリツリーを印刷できるものを探している場合は、Steve Bakerのを使用するのはどうでしょうかtree? (これはほとんどのディストリビューションがリポジトリに含まれるものです。)

マンページを見なければなりませんが、次のように始めるだけです。

tree -a -I '.git'

(dotfiles / -dirsを含み、 ".git"を含むエントリを除く)

答え3

最初に実行したコマンドは、最後にコロンがないため、表示される結果を提供しません。参照するスクリプトは、ls -Rコロンが追加されて表示されるディレクトリパスを選択するためにこれを行いますが、ファイル名とパスがコロンで終わって誤った肯定を提供することを防ぐ方法はありません。これはまた、ほとんどのディレクトリを保持し、一部だけを除外したいタイトルを誤解させます。

質問は次のとおりです。 正規表現にはいくつかの「特性」(標準)があり、最も似ていますが、詳細には大きな違いがあります。 UnixとUnix派生ソフトウェアには、BRE(基本正規表現)とERE(拡張正規表現)という2つの一般的な正規表現があります。一致するファイル名(および大文字と小文字の選択)のより単純な形式は、ほとんどのシェル(および標準の照会)(単に?*と[...])で使用され、正規表現とも呼ばれず、単にパターンと呼ばれます。 Perlは、より拡張された形式を定義しますが、Perl-Compatible Regular Expressions(PCRE)という外部で使用できる形式を定義します。バラより私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか? そしてhttp://en.wikipedia.org/wiki/Regular_Expression

あなたの(?!「予測」はPCREにのみありますが、標準はgrep基本的にBREを実行するかEREを使用します-Eが、一部のバージョンではgrepPCREを実行することができますpcregrepしかし、必要ありません。curr dir の非表示の子を希望する場合は、必要に応じて'^\./\w'or を実行します。'^\./[^.]'しかし、パスのどこにも隠されたディレクトリが存在することを望まないと言われました。これは正規表現では難しいですgrep -v '/\.'

バックスラッシュはbash(すべてではなく、ほとんどのシェル)とgrep(BREまたはERE)で特別なので、二重引用符または一重引用\\符を好みます。ここでは二重引用符で十分ではありません。

より良い方法: 実際にはディレクトリパスだけが必要なので、他の答えで提案する方がfind -type d | grep -v /\.良い方法です。これは、廃棄する一般的なファイル名をリストするのに時間を無駄にしません。または;なしで使用することもできますls -R | grep :$。隠しアイテム(通常のファイルとディレクトリ)は既定-aでは既にスキップされています。lsあなたが引用したスクリプトのように!

答え4

@dan-garthwaiteが言った内容を拡張すると、find通常はディレクトリツリーを検索するために使用されるツールです。一般的な構文は次のとおりです。

find /path/to/search [one or more expressions]

可能なすべての表現については、マニュアルページを参照してください。しかし、いくつかの便利な表現は次のとおりです。

-type x         # Where x = f for files, d for directories, s for sockets, etc.
-mtime x        # Where x = number of minutes since the file was last accessed
-name pattern   # Where pattern = a string to search for (use * for wildcard match)
-iname pattern  # Same as -name, but case insensitive
-size x         # Where x = size, human readable (eg. 500k, 20m, ...)
-user name      # Where name = owner of file

たとえば、5MB より大きいボブが所有するすべての jpg ファイルに対して /home を検索するには、次のようにします。

find /home -user bob -size +5m -iname '*.jpg'

関連情報