Skrypt Bash zliczający liczbę plików

11

Mam skrypt i chcę wyświetlać różne komunikaty, jeśli plik istnieje, czy nie. Mam skrypt taki jak:

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

Jeśli jednak nie istnieją żadne pliki, wyświetla się No such file or directoryzamiast 0 plików. W katalogu znajduje się /import/katalog, więc nie mogę po prostu wykonać lspolecenia, ponieważ zawsze zwróci ono wartość większą niż 0.

Jak mogę policzyć liczbę plików o określonym rozszerzeniu (.zip, .gz itp.) I użyć tej wartości w skrypcie bash do wyświetlenia liczby plików, a następnie użyć jej w instrukcji if do wyświetlenia różnych komunikatów?

Wallace Sean
źródło

Odpowiedzi:

15

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

Chris Ting
źródło
1
Dodałem -maxdepth 1, aby liczyć tylko pliki w bieżącym katalogu
Wallace Sean
1
Prawdopodobnie zechcesz zacytować „* .zip” na wypadek, gdyby w bieżącym katalogu znajdowały się jakieś pliki .zip, gdy zostanie ono wywołane, w którym to przypadku powłoka rozwinie dla ciebie plik * .zip, podczas gdy chcesz, aby przeszedł, aby znaleźć (1).
Phil P
4

Spróbuj tego:

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

Chodzi o to, aby ukryć błąd „brak takiego pliku”, który jest drukowany do STDERR, wysyłając go do bitbucket, i użyć odpowiedniej funkcji testowej do porównywania liczb. ( -gtSkrót od „większy niż”. Tam też -eq, -lt, -ge, itd.)

Mata
źródło
Alternatywnie można również zrobićcount=$(find /import -type f -name "*.zip" | wc -l)
slillibri,
jasne, ale ma to inne znaczenie niż tylko, ls /import/*.zipjeśli istnieją podkatalogi
Mat.
Ustawiłem maxdepth, aby uniknąć zliczania plików w podkatalogach i zaktualizowałem skrypt, aby używał -gt. Dzięki za pomoc
Wallace Sean
Nie powiedzie się to, jeśli w katalogu jest zbyt wiele plików, aby zmieścić się w argv do wywołania ls.
Phil P
Ah, tak. Poprawiony w findwariancie.
Mat.
0

Próbowałem skrypt i, zgodnie z oczekiwaniami, gdy żadne pliki nie są dopasowane, że nie pokazują 0 pliki na wyjściu, ale pokazuje również lsbłąd tuż przed. Rozwiązanie tego jest dość łatwe, nie ma potrzeby rwania ls. Wystarczy zastąpić pierwszy wiersz tym:

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

2>/dev/nullprzekierowuje stderr do /dev/null, pomijając komunikat o błędzie.

Eduardo Ivanec
źródło