-execを使用しながら、findコマンドでファイル名をどのように出力しますか?


33

私は次の行を使用してPWDのすべてのサブディレクトリを見つけsvnadmin verify、各ディレクトリで実行します(それらがSubversionリポジトリであることは既に知っています)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

これは、出力が次のように見えるという事実を除き、うまく機能します。

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

ロギングを簡単にするためにfindsvnadmin verifyコマンドを実行する前にファイル名を印刷したいのです。

私はlsそこに少し絞ろうとしましたが、それを束縛しました、どのようにこれを行うべきですか?

回答:


36

-printf前にオプションを追加するだけです

find -printf '%p' -exec command \;

4
素敵なことに、名前が独自の行の検証出力に先行'%p'する'%p\n'ように変更しました。
15

17
それはあなたが望む形式だ場合、あなたは置き換えることができ@Arronical(フォーマット済み)-printf '%p\n'に簡単に-print
steeldriver

4
find -name <a_name> -print -exec command {} \;
-toliveira

14

再帰したくない場合は、を使用しても意味がありませんfind。シェルで直接行う方がはるかに簡単です。

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */すべてのディレクトリを(見つける*/ディレクトリのみ保証していないファイルが発見されています)。echo "$d"ディレクトリの名前を出力します。 svnadmin verify "$d"ディレクトリをチェックします。

これは、コマンドラインから直接、または形式を変更せずにスクリプト内から実行できます。


1
これは私の目標を達成するためのより良い方法のように見えますが、タイトルと質問の参照が多すぎるという理由だけでFiximanに答えを出さなければなりませfindんでした。知識を向上させてくれてありがとう!
15

これには、グロブを使用する必要があります。グロビングは間違いなく便利で強力ですが、私の個人的な経験では、構文を設定するのがより難しく、bash dotglobやのような他のものを必要とすることが多くglobstar、より長く複雑なスクリプトが作成されます。私は大規模で複雑なタスクのためにグロブを保存する傾向がありfindますが、の構文は、一連のフィルターとコマンドを1つのライナーにまとめるだけで、その場で簡単にまとめられます。
user5359531

@ user5359531 globstarもdotglobも(隠しファイルがあり、実際にそれらを必要とすることがわかっていない限り)ここでは必要ありません。これは明らかに意見の問題ですが、あなたは私がこれまでに出会った最初の人findです。私はfindそれらがはるかに単純であるだけでなく、他のプログラムに渡される任意のファイル名を扱うときにも安全であるため、常にグロブを好んでいます。
テルドン

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

-type dディレクトリのみの場合は追加しました。


{}少なくともsvnadmin verify {}
コス

迅速な対応をありがとう。したがって、このコマンドでは、行末として-exec使用;して2つのコマンドが実行される子シェルが生成されますか?
15

5

これを試して:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

ディレクトリだけが必要な場合(@kos noteに感謝):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

ニースが、これはまた、ファイルを処理します:for f in */ディレクトリのみを処理します
KOS

これはスクリプトでのみ機能しますか?または、コマンドラインで発行できますか?
15

1
@Arronicalは、コマンドラインとしても動作します
Maythux

2
  • . -maxdepth 1代わりに使用./*し、フォルダ構造の最初のレベルのみが必要です
  • を使用し-type d、フォルダのみが必要です
  • 使用する! -name "."、あなたは必要ありません.
  • -execシェルを起動するために使用します
  • sh -cシェル内でコマンドを開始するために使用します

あなたの命令

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

以下

  • -pruneファイルがディレクトリである場合に使用し、そのディレクトリに降りないでください

あなたの命令

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-prune面白そうです。以前は、findコマンドから./* -maxdepth 0戻るのを避けてい.ました。重大なエラーは発生しませんが、出力に含めることは避けたいです。
15

1

find印刷用のオプションフラグがありますが、これについては他の回答で既に述べています。現在処理されている同じファイルに対して複数のコマンドを実行するという観点から問題を見ると、find複数の-execステートメントを使用できます。これは、次の使用を選択できることを意味します。

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

ここでも、このアプローチはただで印刷していないにも適用可能であることに注意してくださいechoprintfまたはその他のユーティリティでなく、他のコマンド。


0

find出力をreadループにパイプすると便利な場合があります。

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

findこの凝ったls例のように、によって返されるファイル名を使用して、より複雑な複合コマンドシーケンスを実行できます。

find . | while read f; do echo ${f} | figlet -k; done

-1

これにより、ファイルの名前と内容のみが再帰的に出力されます。

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.