![Zählen von Dateien in einem Verzeichnis](https://rvso.com/image/898963/Z%C3%A4hlen%20von%20Dateien%20in%20einem%20Verzeichnis.png)
Ich verwende den folgenden Code am Ende eines meiner Skripte, um die Anzahl der Dateien zu zählen, die ich verarbeitet und in dieses Verzeichnis verschoben habe.
# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l
Mein Problem liegt darin, wie ich mit doppelten Dateien umgehe. Derzeit überprüfe ich zuerst, ob die Datei vorhanden ist (da mein Skript die Quelldateien, die ich verarbeite, destruktiv beeinflusst). Wenn es erkennt, dass eine Datei mit diesem Namen bereits verarbeitet wurde, ändere ich den Dateinamen wie folgt.
Doppelte Datei: foo.pdf
Geänderter Name: foo.x.pdf
Wenn es eine foo.x.pdf gibt, benenne ich sie erneut in foo.xx.pdf um. Wiederholen Sie dies bei Bedarf. Ich beabsichtige, später jede „Version“ zu prüfen und die beste auszuwählen, die ich behalten möchte. Aber hier liegt mein Problem. Ich möchte die Anzahl der Dateien zählen, die nicht .x, .xx usw. enthalten. Wie entferne ich diese aus der ls
Ausgabe, damit ich wc -l
nur die eindeutigen Dateien zählen kann?
TL;DR: Wie erhalte ich die Anzahl der Dateien in einem bestimmten Verzeichnis, deren Dateiname eine bestimmte Teilzeichenfolge nicht enthält?
Antwort1
Um die Anzahl der Dateien in einem Verzeichnis zu ermitteln, die nicht enthalten .x.pdf
, versuchen Sie Folgendes:
find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c
Um die Anzahl der Dateien in einem Verzeichnis zu ermitteln, die weder den Punkt - noch einen x
Punkt - enthalten pdf
, versuchen Sie Folgendes:
find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
Oben wird rekursiv durch Unterverzeichnisse gesucht. Wenn Sie das nicht möchten, fügen Sie die Option hinzu -maxdepth 1
. Beispiel:
find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
Beachten Sie, dass diese Methode aufgrund der Verwendung -printf '1'
auch dann sicher ist, wenn das Verzeichnis Dateien enthält, deren Namen Zeilenumbruchzeichen enthalten.
Antwort2
Ohne Unterverzeichnisse:
echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))
Weil:
for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0
Antwort3
Sie können eine oder mehrere Dateien, die einem Muster entsprechen, vom ls
Befehl ausschließen, indem Sie (ein- oder mehrmals) die Option -I
, --ignore=PATTERN
( verwenden.Referenz):
ls -I "*.x*.pdf" "${Destination}" | wc -l
Oder Sie können die Subtraktionsmethode folgendermaßen verwenden:
echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))