Piszę skrypt kompilacji na noc w bashu.
Wszystko jest w porządku i eleganckie, z wyjątkiem jednej małej przeszkody:
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
Mój problem polega na określeniu rozszerzenia pliku i odpowiednim działaniu. Wiem, że problem tkwi w instrukcji if, która testuje plik txt.
Jak mogę sprawdzić, czy plik ma rozszerzenie .txt?
$(dirname $PATH_TO_SOMEWHERE)
i$(basename $PATH_TO_SOMEWHERE)
podzielić na folder i katalog i zrobić coś katalog-ish i plik-ishOdpowiedzi:
Myślę, że chcesz powiedzieć „Czy ostatnie cztery znaki $ file są równe
.txt
?” Jeśli tak, możesz skorzystać z:Zwróć uwagę, że odstęp między
file:
i-4
jest wymagany, ponieważ modyfikator „: -” oznacza coś innego.źródło
${var:-4}
nie jest tym samym, co${var: -4}
; pierwsza (bez spacji) rozwinie się jako „-4”, jeśli zmienna nie jest ustawiona, druga (ze spacją) zwraca ostatnie 4 znaki zmiennej.if [ "${file: -4}" == ".txt" ]
zamiast tego.Robić
lubię to:
To znaczy, podwójne nawiasy i brak cudzysłowów.
Prawa strona
==
to wzór muszli. Jeśli potrzebujesz wyrażenia regularnego, użyj=~
wtedy.źródło
if
instrukcji wielowarstwowej . Udostępniam to tutaj na wypadek, gdyby to komuś pomogło.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. Jest krótszy, bardziej przejrzysty, łatwiejszy do dodania dodatkowych rozszerzeń i może być łatwo konfigurowalny (poprzez umieszczenie "csv | png" w zmiennej).if [[ "$file" == *.txt ]]
Jeśli plik zawiera spacje w nazwie, wymagane jest umieszczanie w cudzysłowie.Po prostu nie możesz być pewien w systemie Unix, że plik .txt naprawdę jest plikiem tekstowym. Najlepszym rozwiązaniem jest użycie „pliku”. Może spróbuj użyć:
Następnie możesz użyć listy typów MIME, aby dopasować lub przeanalizować pierwszą część MIME, w której otrzymujesz takie rzeczy, jak „tekst”, „aplikacja” itp.
źródło
file -i...
obejmuje kodowanie MIME, można użyćfile --mime-type -b ...
Możesz użyć polecenia „plik”, jeśli faktycznie chcesz uzyskać informacje o pliku, zamiast polegać na rozszerzeniach.
Jeśli czujesz się komfortowo z używaniem rozszerzenia, możesz użyć grep, aby sprawdzić, czy pasuje.
źródło
file
polecenie. Właściwie próbowałem dopasować na podstawie danych wyjściowych wspomnianego polecenia ... ale strasznie mi się nie udaje.Możesz też:
źródło
case $FILE in *.txt ) ... ;; esac
wydawałoby się solidniejsze i bardziej idiomatyczne.Podobnie jak „plik”, użyj nieco prostszego „mimetype -b”, które będzie działać bez względu na rozszerzenie pliku.
Edycja: może być konieczne zainstalowanie libfile-mimeinfo-perl w systemie, jeśli typ MIME nie jest dostępny
źródło
Prawidłowa odpowiedź na pytanie, jak wziąć rozszerzenie dostępne w nazwie pliku w systemie Linux, to:
Przykład drukowania wszystkich rozszerzeń plików w katalogu
źródło
Napisałem skrypt bash, który sprawdza typ pliku, a następnie kopiuje go do lokalizacji, używam go do przeglądania filmów, które oglądałem online z pamięci podręcznej Firefoksa:
Korzysta z pomysłów podobnych do przedstawionych tutaj, mam nadzieję, że komuś to pomoże.
źródło
Myślę, że to
'$PATH_TO_SOMEWHERE'
jest coś takiego'<directory>/*'
.W takim przypadku zmieniłbym kod na:
Jeśli chcesz zrobić coś bardziej skomplikowanego z nazwami katalogów i plików tekstowych, możesz:
Jeśli masz spacje w nazwach plików, możesz:
źródło
for
iwhile
pętle lepiej być zarezerwowane, gdy treść pętli musi być bardziej złożona.