Mam pliki o nazwie z YYYYMMDD
nazwą pliku, takie jak
file-name-20151002.txt
Chcę ustalić, czy ten plik został zmodyfikowany po 02.10.2015.
Uwagi:
- Mogę to zrobić, patrząc na wynik
ls
, ale wiem, że analizowanie wynikuls
jest złym pomysłem. - Nie muszę znajdować wszystkich plików datowanych po określonej dacie, wystarczy przetestować jeden konkretny plik naraz.
- Nie martwię się, że plik zostanie zmodyfikowany w tym samym dniu po jego utworzeniu. To znaczy, chcę tylko wiedzieć, czy ten plik z
20151002
nazwą w nazwie został zmodyfikowany 3 października 2015 roku lub później. - Jestem na MacO 10.9.5.
bash
files
osx
timestamps
Peter Grill
źródło
źródło
Odpowiedzi:
Oto kilka możliwych sposobów:
OSX stat
:GNU date
:zsh
tylko:Stosowanie:
Przykładowe dane wyjściowe:
lub
źródło
Poniższy skrypt sprawdzi daty wszystkich plików określonych w wierszu poleceń:
Wymaga to wersje z GNU
sed
,date
orazstat
Oto wersja, która nie została przetestowana, ale powinna działać na komputerach Mac (i FreeBSD itp.), Jeśli poprawnie przeczytałem strony podręcznika online:
źródło
sed: illegal option -- r
z MacOS 10.9.5.-r
jestsed
opcją GNU , która nakazuje używać rozszerzonych wyrażeń regularnych. Możesz zmienić skrypt sed, aby używał podstawowego wyrażenia regularnego zamiast rozszerzonego (np.sed -e 's/^.*\(2015\)/\1/')
Ale reszta skryptu prawdopodobnie nadal zawiedzie, ponieważ wymaga wersji GNUdate
istat
, i nie sądzę, że Mac są dostarczane z nimi jako standard (chociaż są dostępne dla komputerów Mac we wstępnie skompilowanych pakietach)Używając bash i
stat
oraz,expr
aby uzyskać daty jako liczby i porównać je:To była moja wcześniejsza odpowiedź związana z Linuksem.
Operator wyrażenia
=~
regularnego bash przechwytuje 8 cyfr nazwy pliku do tablicy bash BASH_REMATCH.[[ ]]
porównuje ciągi znaków, chociaż zamiast tego porównuje się je jako liczby[ -gt ]
.źródło
-c
możliwościstat
.stat -f %m -t %F "$file"
. Przepraszam, nie mogę tego przetestować.stat
komentarzu wydaje się, że wszystko działa , ale nie ma danych wyjściowych dla wszystkich przypadków testowych. Ale co się"$file" =~ ([0-9]{8}).txt$
dzieje?.txt
na końcu nazwy pliku. Nawiasy()
przechwytują 8 cyfr i możesz je znaleźć${BASH_REMATCH[1]}
.if [[=~]]
was może spróbować podstawowąif filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
, a następnie zastąpić${BASH_REMATCH[1]}
przez$filedate
.Możesz to zrobić:
touch
polecenia (dodając 0 dla godziny / minuty / sekundy), aby ustawić datę modyfikacji pliku tymczasowegoPonieważ twoje pytanie dotyczy
bash
, prawdopodobnie używasz Linuksa.test
Program używany w systemie Linux (część coreutils ) posiada rozszerzenia dla porównania timestamp (-nt
i-ot
) nie została odnaleziona w POSIXtest
.Komentarze POSIX na ten temat w uzasadnieniu dla
test
:Korzystając z tego rozszerzenia, możesz wtedy
-nt
operatora,test
aby dokonać porównania, o które prosiłeś.Oto przykład. Wyjaśnienie OP wspomniało o platformie, więc można ją wykorzystać
stat
jako alternatywę dla plików tymczasowych (porównaj OSX i Linux ):źródło
trap
polecenia.Inne
zsh
podejście:Zgłasza pliki, które mają w nazwie coś, co wygląda jak znacznik czasu, ale nie odpowiada czasowi ostatniej modyfikacji.
zsh
ma mnóstwo takich operatorów do manipulowania globami i zmiennymi. Bardzo przydatne jest szybkie wykonanie dowolnej pracy (i ogólnie niezawodnie), ale ciężko jest obejść je wszystkie i często wytwarza to, co zwykle nazywamy kodem tylko do zapisu (eufemizm w przypadku nieczytelnego kodu, choć oznacza również, że nie T trzeba go przeczytać podczas pisania do pojedynczego użycia w wierszu polecenia)Szybki przegląd:
**/pattern(qualifier)
: glob rekurencyjny z kwalifikatorem glob.[0-9](#c8)
dopasowuje 8 cyfr. To zsh extendedglob odpowiednikiemksh
„s{8}([0-9])
.D
: dołącz ukryte plikie@...@
: kwalifikator eval glob do uruchomienia tekstu w celu dalszej kwalifikacji plików. Przekazano ścieżkę pliku$REPLY
zstat...
pobierz w tablicy mtime sformatowany jako RRRRMMDD$m
.${REPLY:t}
: rozwija się do ogona t (basename) pliku.${(SM)something#pattern}
. Wyodrębnij z czegoś wzór pasujący do części . Te ( S szukanie ciągu) i (rozwinięcie do części M ) są nazywane flagami rozszerzania parametrów .S
M
źródło