find -exec erkennt das Argument nicht - linux, bash, unix

Ich versuche, die gesamten Zeilen in den Dateien in einem Verzeichnis zu zählen. Dazu versuche ich eine Kombination aus find und wc zu verwenden. Allerdings, wenn ich renne find . -exec wc -l {};Ich erhalte den Fehler find: missing argument to -exec. Ich sehe keine offensichtlichen Probleme, keine Ideen?

Antworten:

4 für die Antwort № 1

Sie brauchen nur einen Platz dazwischen {} und ;

find . -exec wc -l {} ;

Beachten Sie, dass, wenn Unterverzeichnisse vom aktuellen Speicherort vorhanden sind, wc wird eine Fehlermeldung für jeden von ihnen erzeugen, die ungefähr so ​​aussieht:

wc: ./subdir: Is a directory

Um dieses Problem zu vermeiden, möchten Sie vielleicht etwas sagen find um die Suche auf Dateien einzuschränken:

find . -type f -exec wc -l {} ;

Ein weiterer Hinweis: gute Idee mit dem -exec Möglichkeit . Zu oft geben Leute Befehle zusammen, um das gleiche Ergebnis zu erhalten, zum Beispiel wäre es hier:

 find . -type f | xargs wc -l

Das Problem mit Piping-Befehlen ist, dass es bricht, wenn Dateien Leerzeichen enthalten. Zum Beispiel hier, wenn ein Dateiname "a b" war, wc würde "a" und dann "b" getrennt erhalten und Sie würden offensichtlich 2 Fehlermeldungen erhalten: a: no such file und b: no such file.

Sofern Sie nicht wissen, dass Ihre Dateinamen niemals Leerzeichen enthalten (oder nicht druckbare Zeichen), müssen Sie, wenn Sie Befehle zusammenführen müssen, dies mitteilen alle die Werkzeuge, die Sie miteinander verbinden, um das NULL-Zeichen zu verwenden (

find . -type f -print0 | xargs -0 wc -l

1 für die Antwort № 2

Mit Version 4.0 oder höher von bash, du brauchst deine nicht find Befehl überhaupt:

shopt -s globstar
wc -l **/*

Es gibt keine einfache Möglichkeit, Verzeichnisse zu überspringen, diewie von Gui Rava aufgezeigt, möchten Sie vielleicht tun, es sei denn, Sie können Dateien und Verzeichnisse nach Namen unterscheiden. Zum Beispiel, vielleicht haben Verzeichnisse nie . in ihrem Namen, während alle Dateien mindestens eine Erweiterung haben:

wc -l **/*.*

Am beliebtesten