web-dev-qa-db-ja.com

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

次の行を使用して、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.

ロギングを容易にするために、svnadmin verifyコマンドを実行する前にfindがファイル名を印刷することを本当に望んでいます。

そこに少しlsを詰め込もうとしましたが、それを固めてしまいました。どうすればよいでしょうか(できれば単純に)。

31
Arronical

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

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

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

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

for d in */はすべてのディレクトリを検索します(*/はディレクトリのみを検索し、ファイルは検索されません)。 echo "$d"はディレクトリ名を出力します; svnadmin verify "$d"はディレクトリをチェックします。

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

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

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

6
7171u

これを試して:

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

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

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
5
Maythux
  • . -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 "{}"' \; 
2
A.B.

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

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

繰り返しますが、このアプローチは、echoprintf、または他のユーティリティを使用した印刷だけでなく、他のコマンドにも適用できることに注意してください。

1

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
0
Ves