サブディレクトリを除くディレクトリパスでファイルを検索する

サブディレクトリを除くディレクトリパスでファイルを検索する

findこれを使用してディレクトリを巡回してもサブディレクトリに再帰したくない場合はどうすればよいですか?

私はそれを試しましたが、-prune動作しません。選択の余地がない-maxdepth

find /opt/projectname/bin -type f /opt/projectname/bin -prune -o -print
find: missing conjunction
/opt/projectname/bin/file_1_is_printed
/opt/projectname/bin/file_2_is_printed
/opt/projectname/bin/directory_within_bin/some_file_should_not_be_printed
/opt/projectname/bin/directory_2_within_bin/some_file_2_should_not_be_printed

/usr/bin/find:
         find.c $Date: 2011/08/12 15:04:36 $Revision: r11.31/4 PATCH_11.31 (PHCO_42158)
         libcpio.c $Date: 2008/05/27 16:08:10 $Revision: r11.31/2 PATCH_11.31 (PHCO_36666)
         $Revision: @(#) find R11.31_BL2011_0923_2 PATCH_11.31 PHCO_42158

この質問は重複しません。ここにGNUはありません。この質問は重複する可能性がありますが、これらの質問に対する回答を得るには、すべてGNUツールをインストールする必要があります。したがって、ここにある回答が問題解決に役立つ場合、これはユニークなスレッドです。

答え1

質問のコマンドが実際に入力したと仮定すると、ジョブとディレクトリfind検索のルートが混在してエラーメッセージが表示されます。

私の提案は以下に基づいています。このHP UXのマニュアルページfind、あなたの 'いいえ-maxdepth「声明。

次のバリエーションをお試しください。

find /opt/projectname/bin -path '/opt/projectname/bin/*/*' -prune -o -type f -print

ディレクトリに「あまりにも多くの」ファイルがないことがわかったら、実際にこの「よりきれいな」代替策を検討します。ただし、お客様の場合は、以下を受け付けない場合があります。

find /opt/projectname/bin/* -type f -print -o -prune

答え2

「接続不足」エラーは、後でディレクトリ名を繰り返したが、それを解析する方法がわからないために発生し-type fますfind

サブディレクトリの巡回を防ぐには、通常のファイルではなくディレクトリをクリーンアップする必要があります。ただし、起動ディレクトリをクリーンアップすることはできません。それ以外の場合、findそのディレクトリ以外には何も処理されません。起動ディレクトリを識別する簡単な方法は名前を.

find /opt/projectname/bin/. -name . -o -type d -prune -o -print

説明する:

  • -name ..— [何もしない] 名前が次の場合
  • それ以外の場合:-type d- ファイルがディレクトリの場合は入力しないでください。
  • そうでない場合:印刷パス

答え3

今日はこの問題で苦労しており、多くの調査とテストを行いましたが、解決策を見つけました。するいいえ無視する必要がある個々のサブディレクトリを指定する必要があります。ノート以下に、dir-name できるはい.。 )

$ find  dir-name/*  -name file-name  -print  -o -prune

.たとえば、ファイルを見つける必要がある場合、.loginコマンドは次のようになります。

$ find  dir-name/.*  -name .file-name  -print  -o -prune

-exec見つかったファイルを削除するなどの操作を実行する必要がある場合は、次のfor-doループが必要になるようです。

$ for  FILE  in  $( find  dir-name/*  -name file-name  -print  -o -prune )
do
    echo  "Removing  $FILE"
    rm  -f  $FILE
done

ああ:特にHP-UX-11.31のKorn-shell用です。

サブディレクトリを避けるために、より単純な構文を使用するLinuxでは必要ありません。 HP-UXに加えて、Linux以外のNixバリアントでも動作できますが、私はHP-UXだけをテストしました。

答え4

ここで必要なのは、より多くのGNU -mindepth 1 -maxdepth 1(通常はそうではありません)とそれに対応する標準です。

find /path/to/dir -mindepth 1 -maxdepth 1 ...

実際には短いです。

find /path/to/dir/. ! -name . -prune ...

ここにあります。打つツリーのルートを除くすべての項目とツリーのルートも除外します。は false なので、使用! -name .されない限り、残りはスキップされます。.-o

注意すべき3つの点:

  1. シンボリックリンクの場合は同じではありません。/path/to/dirこの場合、2番目のリンクはオプションを渡すのと似ています-Hが、1番目のリンクはリンクで停止します。
  2. ファイルパスが/path/to/dir/./file/within置き換えられます/path/to/dir/file/within
  3. 上記のように注意してください-o。たとえば、so print(so not)find /path/to/dir/. ! -name . -prune -type l -o -type dと解釈されます。それを書きたいと思います: 見てだけ 。find /path/to/dir/. '(' ! -name . -prune -type l ')' -o -type d/path/to/dir/.-mindepth 1find /path/to/dir/. ! -name . -prune '(' -type l -o -type d ')'/path/to/dir

find最近、ほとんどの実装は-path元々BSDから来ており、最終的にPOSIXで指定された述語をサポートしているので、次のようにして最初の2つの問題を解決できます。

find /path/to/dir ! -path /path/to/dir -prune ...

ただし、パラメータは-pathパターンと見なされるため、任意のディレクトリパスに使用できます。たとえば、次のようになります。

「$dir」を見つけました! -パス "$dir" -トリム...

より一般的には、GNU標準に対応するものについては、-maxdepth n以下を参照してください。POSIX照会を特定の深さに制限しますか?

関連情報