Chcę wymienić wszystkie pliki dziennika, które nie należą do dzisiaj, i tylko pliki, które zawierają 2015
ich nazwy.
Oto polecenia, które wypróbowałem:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
Dane wyjściowe z obu są niczym, ale nadal istnieją pliki. Coś jest nie tak z tymi poleceniami i nie rozumiem co. Każda pomoc będzie mile widziana.
command-line
find
rɑːdʒɑ
źródło
źródło
find
Część wygląda dobrze dla mnie, ale ja też miałem problemy z-exec
parametrem. Nie mogłem też tego uruchomić. (Próbowałem przenieść wszystkie pliki jpg z jednego folderu do jego katalogu nadrzędnego - i ostatecznie zrobiłem to ręcznie ...)2015
ich nazwami (inna oczywista wada sposobu pisania polecenia), podejrzewam, że pojawiłby się jakiś wynik. Więc możesz opublikować odpowiedź na ten temat.Odpowiedzi:
Polecenie
find . -name '*2015*' -mmin +1440 -ls
prawdopodobnie zrobi to, co chcesz. Szczegóły poniżej.Twoje pierwsze polecenie miało
-name 2015
. Nie działało, ponieważ wyszukuje tylko pliki o dokładnie takich nazwach2015
, bez żadnych innych znaków.Twoje drugie polecenie
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
mogło się nie powieść z kilku powodów:1. Niecytowane
*
znaki są rozszerzane przez powłokę, a następnie przekazywane dofind
.Jeśli w bieżącym katalogu znajdują się pliki (w tym, w którym uruchomiłeś tę
find ...
komendę), których nazwy zawierają2015
(i nie zaczynają się na a.
), powłoka została rozwinięta*2015*
do listy nazw plików, a następnie przekazana ta lista jako argumentyfind
. To nie jest to, czego chcesz - zamiast tego chcesz przekazać*2015*
dosłownie jako argument do znalezienia, abyfind
, a nie powłoka, mogła znaleźć, które pliki pasują do niego.Aby rozwiązać ten problem, cytat
*2015*
. Istnieją trzy popularne sposoby:'*2015*'
(tj.find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)"*2015*"
(tj.find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)\*2015\*
(tj.find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)I sugeruję pisanie go z apostrofami jak
'*2015*'
, ponieważ:\
może utrudnić dokładne sprawdzenie, co powłoka przekazuje dofind
polecenia."
czasami wymaga nieco skomplikowanych zasad .Ale w tym przypadku tak naprawdę nie ma to znaczenia.
'
i"
oba traktują*
to samo, a wyrażenie nie jest wystarczająco skomplikowane do\
cytowania, aby utrudnić zrozumienie.2.
-mtime +1
wybiera tylko pliki zmodyfikowane dwa lub więcej dni temu.Jak
man find
mówi:Załóżmy, że plik został zmodyfikowany 47 godzin temu. Aby dowiedzieć się, ile to jest 24-godzinnych okresów,
find
zaokrągla się w dół : jest to jeden okres 24-godzinny. Ale-mtime +1
pasuje tylko do plików, których czasy modyfikacji są ściśle dłuższe niż jeden 24-godzinny okres temu. W związku z tym pliki z wczoraj nie są dopasowane.Zobacz, dlaczego funkcja find -mtime +1 zwraca tylko pliki starsze niż 2 dni? po więcej informacji, jak sugeruje steeldriver .
Aby znaleźć pliki ostatnio zmodyfikowano każdej chwili więcej niż 24 godziny temu , proponuję zamiast określające go jako 1440 minut temu z
-mmin +1440
:Niektórzy czytelnicy mogą się zastanawiać, dlaczego nie cytowałem
{}
. Niektórzy cytują,{}
aby przypomnieć ludziom, że nie jest to wyrażenie na rozwijanie nawiasów klamrowych . Pociski w stylu Bourne'a (jak bash ) nie wymagają{}
cytowania. Może jakaś powłoka nie w stylu Bourne'a traktuje ją specjalnie; dlatego niektórzy użytkownicy mogą to zacytować. Istnieje jednak błędne przekonanie, że czasami trzeba cytować,{}
aby-exec
poprawnie traktować nazwy plików ze spacjami. Że; s fałsz: z{}
lub'{}'
,find
dostaje takie same argumenty, jak skorupa usuwa cytaty przed przejściem'{}'
dofind
. Aby przeciwdziałać temu nieporozumieniu, nie cytuję{}
, ale jest to kwestia stylu - jeśli wolisz{}
dokumentować, w jaki sposób powłoka nie traktuje,{
a}
specjalnie, to w porządku.Polecam również albo zmienić
ls
polecenie, lub (jak muru zasugerował ) zastąpić gofind
„s-ls
działania.ls -ltrh
prawdopodobnie nie robi tego, co zamierzasz, ponieważ jest uruchamiany osobno dla każdego znalezionego pliku, a zatem flagi-t
i-r
, które określają sortowanie, są nieistotne.Chociaż dane wyjściowe zostaną sformatowane nieco inaczej niż przy
ls -l
użyciu, użycie-ls
jest prostsze i łatwiejsze.Lub jeśli zdecydujesz, że naprawdę potrzebujesz tylko wymienić nazwy pliku (w tym ich ścieżki, w stosunku do
.
), możesz po prostu określić brak akcji, co spowoduje-print
użycie domyślnej akcji:źródło
newerXY
składnia, która akceptuje argumenty kalendarza np.-newermt 'yesterday'
i! -newermt 'yesterday'
Cytuj wyrażenie, a proponuję również zacytować nawiasy
lub
nie musisz przekazywać znalezionych plików do ls
źródło
-type f
? A jeślils
trzeba użyć, sugeruj użycie-ls
.W zsh możesz używać globalnych kwalifikatorów (jest to unikalna funkcja zsh, niedostępna w innych powłokach, takich jak bash).
Wyświetla tylko pliki w bieżącym katalogu; aby rekurencyjnie przeglądać katalogi , użyj
Dzięki
find
,-name 2015
tylko wyszukuje pliki, których nazwa jest dokładnie2015
.-name *2015*
działa tylko wtedy, gdy2015
w bieżącym katalogu nie ma plików, których nazwa zawiera , ponieważ powłoka rozwija wzorzec*2015*
przedfind
wywołaniem. Musisz zacytować wzór:Zauważ, że zarówno
find -mtime +1
i zsh*(m+1)
znajdują pliki, które mają co najmniej 48 godzin , a nie pliki starsze niż dzisiaj. Znak plus oznacza „ściśle więcej niż”, a liczba dni jest zaokrąglana w dół. Aby znaleźć pliki, które mają co najmniej 24 godziny, użyj-mtime +0
lub(m+0)
.Jeśli chcesz znaleźć pliki, które zostały ostatnio zmodyfikowano wczoraj lub wcześniej , można skorzystać
find
z-newermt
predykatu :Nie ma naprawdę wygodnego sposobu na wykonanie tego testu w Zsh.
źródło