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つの点:
- シンボリックリンクの場合は同じではありません。
/path/to/dir
この場合、2番目のリンクはオプションを渡すのと似ています-H
が、1番目のリンクはリンクで停止します。 - ファイルパスが
/path/to/dir/./file/within
置き換えられます/path/to/dir/file/within
。 - 上記のように注意してください
-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 1
find /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照会を特定の深さに制限しますか?。