Bash-Skript zum Zählen der Anzahl der Dateien


11

Ich habe ein Skript und möchte verschiedene Meldungen anzeigen, ob eine Datei vorhanden ist oder nicht. Ich habe ein Skript wie:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

Wenn jedoch keine Dateien vorhanden sind, wird dies No such file or directoryanstelle von 0 Dateien angezeigt. Es gibt ein Verzeichnis im /import/Verzeichnis, daher kann ich nicht einfach einen lsBefehl ausführen, da dieser immer einen Wert größer als 0 zurückgibt.

Wie kann ich die Anzahl der Dateien einer bestimmten Erweiterung (.zip, .gz usw.) zählen und diesen Wert in einem Bash-Skript verwenden, um sowohl die Anzahl der Dateien anzuzeigen als auch ihn in einer if-Anweisung zum Anzeigen verschiedener Nachrichten zu verwenden?

Antworten:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
Ich habe -maxdepth 1 hinzugefügt, um nur Dateien im aktuellen Verzeichnis zu zählen
Wallace Sean

1
Sie möchten wahrscheinlich '* .zip' in Anführungszeichen setzen, falls sich beim Aufrufen .zip-Dateien im aktuellen Verzeichnis befinden. In diesem Fall hat die Shell die * .zip-Datei für Sie erweitert, während Sie möchten, dass sie gefunden wird (1).
Phil P

4

Versuchen Sie es damit:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

Die Idee ist, den Fehler "Keine solche Datei" zu verbergen, der an STDERR gedruckt wird, indem er an den Bitbucket gesendet wird, und die richtige Testfunktion zum Vergleichen von Zahlen zu verwenden. ( -gtSteht für „größer als“. Es gibt auch -eq, -lt, -ge, etc.)


Als Alternative könnten Sie auch tuncount=$(find /import -type f -name "*.zip" | wc -l)
Slillibri

sicher, aber das hat eine andere Bedeutung als nur, ls /import/*.zipwenn es Unterverzeichnisse gibt
Mat

Ich habe die maximale Tiefe festgelegt, um das Zählen von Dateien in Unterverzeichnissen zu vermeiden, und das Skript so aktualisiert, dass es -gt verwendet. Vielen Dank für die Hilfe
Wallace Sean

Dies schlägt fehl, wenn sich zu viele Dateien im Verzeichnis befinden, um in argv für den ls-Aufruf zu passen.
Phil P

Ah richtig. Mit einer findVariante korrigiert .
Mat

0

Ich habe versucht , das Skript und, wie erwartet, wenn keine Dateien abgestimmt sind es nicht zeigen 0 Dateien in der Ausgabe, sondern zeigt auch den lsFehler kurz vor. Das zu lösen ist ganz einfach, es besteht kein Grund zum Graben ls. Ersetzen Sie einfach die erste Zeile durch:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/nullleitet stderr an weiter /dev/nullund unterdrückt die Fehlermeldung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.