Wie geben Sie den Dateinamen im Befehl find aus, während Sie -exec verwenden?

33

Ich benutze die folgende Zeile, um alle Unterverzeichnisse des PWD zu finden und svnadmin verifyin jedem Verzeichnis auszuführen (ich weiß bereits, dass es sich um Subversion-Repositorys handelt).

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

Dies funktioniert gut, abgesehen davon, dass die Ausgabe folgendermaßen aussieht:

* 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.

Ich möchte findden Dateinamen unbedingt vor dem Ausführen des svnadmin verifyBefehls ausdrucken , um die Protokollierung zu vereinfachen.

Ich habe versucht, ein wenig lshineinzudrücken, habe es aber hochgedrückt. Wie soll ich das tun (am besten einfach)?

Arronisch
quelle

Antworten:

36

fügen Sie einfach eine -printfOption hinzu

find -printf '%p' -exec command \;
Fiximan
quelle
4
Schön, ich habe '%p'es '%p\n'so geändert , dass der Name vor der Verifizierungsausgabe in einer eigenen Zeile steht.
Arronical
17
@Arronical wenn das das Format ist Sie wollen, könnten Sie die ersetzen (formatiert) -printf '%p\n'mit dem einfacheren-print
steeldriver
4
find -name <a_name> -print -exec command {} \;
Toliveira
14

Wenn Sie nicht wiederkehren möchten, hat die Verwendung keinen Sinn find. Es ist viel einfacher, es direkt in der Shell zu tun:

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

Der for d in */findet alle Verzeichnisse (der */stellt sicher, dass nur Verzeichnisse und keine Dateien gefunden werden); Der echo "$d"gibt den Namen des Verzeichnisses aus. das svnadmin verify "$d"wird das Verzeichnis überprüfen.

Dies kann entweder direkt über die Befehlszeile oder innerhalb eines Skripts ohne Änderung des Formats ausgeführt werden.

terdon
quelle
1
Dies scheint ein besserer Weg zu sein, um mein Ziel zu erreichen, aber ich musste Fiximan die Antwort geben, nur weil mein Titel und meine Frage findso wichtig waren . Vielen Dank für die Verbesserung meiner Kenntnisse!
Arronical
Dies erfordert die Verwendung eines Glob. Globbing ist auf jeden Fall nützlich und leistungsstark, aber meiner persönlichen Erfahrung nach ist die Syntax schwieriger einzurichten und erfordert häufig andere Dinge wie dotglobund globstarin bash, wodurch ein längeres, komplizierteres Skript erstellt wird. Ich tendiere dazu, Globs für große, komplizierte Aufgaben zu speichern, während finddie Syntax schneller zusammengesetzt werden kann, indem einfach eine Reihe von Filtern und Befehlen zu einem Einzeiler zusammengefasst werden.
user5359531
@ user5359531 hier werden weder globstar noch dotglob benötigt (es sei denn, Sie wissen, dass Sie versteckte Dateien haben und diese wirklich wollen). Dies ist natürlich eine Ansichtssache, aber Sie sind die erste Person, die mir jemals begegnet ist und die das eher stumpfe Format der findEinfachheit für wichtig hält. Ich bevorzuge immer Globs, findda ich sie nicht nur viel einfacher finde, sondern sie auch sicherer sind, wenn es um beliebige Dateinamen geht, die an andere Programme übergeben werden.
Terdon
6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Ich habe hinzugefügt, -type dwenn es nur Verzeichnisse sind.

7171u
quelle
Ich würde zitieren {}, zumindest insvnadmin verify {}
kos
Danke für die schnelle Antwort. Gibt es in diesem Befehl -execeine untergeordnete Shell, in der die beiden Befehle ausgeführt werden und die ;als Zeilenende verwendet werden?
Arronical
5

Versuche dies:

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

Wenn du nur Verzeichnisse willst (Danke an @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
Maythux
quelle
Nizza, aber das wird auch Dateien verarbeiten: for f in */wird nur Verzeichnisse verarbeiten
Kos
Funktioniert das nur in einem Skript? Oder kann ich es auf der Kommandozeile ausgeben?
Arronical
1
@Arronical funktioniert auch als Kommandozeile
Maythux
2
  • Verwenden Sie . -maxdepth 1stattdessen ./*nur die erste Ebene in der Ordnerstruktur
  • Verwenden -type dSie nur Ordner
  • Verwenden ! -name "."Sie, brauchen Sie nicht.
  • Verwenden Sie -exec, um eine Shell zu starten
  • Verwenden Sie sh -cdiese Option , um Befehle in der Shell zu starten

Dein Befehl

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

oder kürzer

  • Verwenden Sie -prunediese Option, wenn es sich bei der Datei um ein Verzeichnis handelt, und steigen Sie nicht in dieses Verzeichnis ab

Dein Befehl

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
AB
quelle
-prunesieht interessant aus. Früher habe ich es ./* -maxdepth 0vermieden, .vom Befehl find zurückzukehren. Es verursacht keinen kritischen Fehler, aber ich ziehe es vor, das nicht in meiner Ausgabe zu haben.
Arronical
1

findhat Option Flags zum Drucken, die bereits in anderen Antworten erwähnt sind. Wenn wir uns das Problem aus der Perspektive der Ausführung mehrerer Befehle für dieselbe aktuell verarbeitete Datei ansehen, findkönnen mehrere -execAnweisungen verwendet werden. Dies bedeutet, dass wir uns für Folgendes entscheiden könnten:

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

Auch beachten Sie, dass dieser Ansatz anwendbar ist , nicht nur den Druck mit echo, printfoder andere Nebenkosten , sondern auch andere Befehle.

Sergiy Kolodyazhnyy
quelle
0

Es kann nützlich sein, die findAusgabe an die readSchleife weiterzuleiten:

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

Sie können damit eine kompliziertere, zusammengesetzte Befehlssequenz mit Dateinamen ausführen, die von zurückgegeben werden find, wie im folgenden lsBeispiel:

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

Dadurch werden Name und Inhalt von Dateien nur rekursiv gedruckt.

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
Prashant Adlinge
quelle