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 nazwach 2015
, 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 do find
.
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 argumenty find
. To nie jest to, czego chcesz - zamiast tego chcesz przekazać *2015*
dosłownie jako argument do znalezienia, aby find
, 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ż:
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:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
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
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
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ć go find
„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.
find . -name '*2015*' -mmin +1440 -ls
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:
find . -name '*2015*' -mmin +1440
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 ...)