Zählen von Dateien in einem Verzeichnis

Zählen von Dateien in einem Verzeichnis

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 lsAusgabe, damit ich wc -lnur 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 xPunkt - 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 lsBefehl 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)))

verwandte Informationen