私はすでにこの質問に対する答えを知っていると思います。しかし、バッシュ魔法を持つ人がいるかどうかを確認したかった。
状態:
ディレクトリがあるとしましょう。/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/
ディレクトリのリストを含むファイルがあります。
/mnt/Transfer/Downloads/Documents/ProjectProposal/
/mnt/Transfer/Downloads/Documents/ProjectDesign/
/mnt/Transfer/Downloads/Documents/Thesis/Drafts/
...
質問:
単純にファイルを繰り返すことなく、リストファイルのディレクトリが最初のディレクトリのサブディレクトリであることを確認するBashスクリプト(たぶん1行?)にすばやく簡単な方法がありますか?つまり、リストファイルのディレクトリが一部のディレクトリのサブディレクトリであることを確認してください。
さらなる説明のために編集されました。がある場合は、リストファイル(たとえば)にそのエントリを含むサブディレクトリがあるかどうかを/foo/mnt/Transfer/Downloads/Documents/ProjectProposal/
知りたいです。/foo/mnt/Transfer/Downloads/
文字列一致で十分です。ディレクトリが実際に存在することを確認する必要はありません。
私は同様のものを実装しましたが、grep -q $FILEDIRECTORY $accessLog
これはリストファイルエントリに基づいて別々のディレクトリをgrepするより簡単なケースです。今私は反対方向に行き、基本的に単一のディレクトリリストファイルから単一の全体を「grep」したいと思います。
ループを実行する必要がある場合はそうします。 「より良い方法」があるかどうかを調べることに興味があるだけです。
よろしくお願いします!
ベストアンサー1
使用の欠点grep
は、パターンマッチングを文字列の先頭に囲むことができるように正規表現を許可する必要があるか、正規表現を無効にし、すべてのパターンとターゲットマッチングが共通で繰り返されないことです。プレフィックス。
正規表現の問題は、このパターンが^/mnt/one.two/
文字列と一致することです/mnt/one/two/
。文字列が/mnt/one/two/
一致する可能性がある問題を修正しました/one/two/
。
別のアプローチは、awk
ターゲットディレクトリパスを各行と順番に比較して、ターゲットの開始とパターン行の開始が一致することを確認することです。ディレクトリのリストが次の場所にあるとしますfile
。
dir="/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/"
awk -v dir="$dir" '$0 == substr(dir, 1, length($0))' file
あなたの例の結果は次のとおりです。
/mnt/Transfer/Downloads/Documents/Thesis/Drafts/