Oto wersja, która nie używa ls
. Powinno być mniej podatne na dziwne znaki w nazwach plików:
find . -maxdepth 1 -type f -name '*.html' -print0
\| xargs -0 stat --printf "%Y\t%n\n"
\| sort -n
\| tail -n 10
\| cut -f 2
\| xargs cp -t ../Test/
użyłem find
na kilka powodów:
1) Jeśli istnieje zbyt wiele plików w katalogu, bash będzie przeszkadzać w asterisk ekspansja*.
2) Użycie argumentu -print0
do find
rozwiązuje problem powiększania spacji bash w nazwie pliku do wielu tokenów.
* W rzeczywistości, bash dzieli bufor pamięci na jego rozszerzenie z dziką kartą i jego zmienne środowiskowe, więc nie jest to ściśle funkcja liczby nazw plików, ale raczej całkowita długość nazw plików i zmiennych środowiskowych. Zbyt wiele zmiennych środowiskowych => brak rozwinięcia symboli wieloznacznych.
EDYCJA: Dodano niektóre ulepszenia @ glennjackman. Zachowano początkowe użycie find
, aby uniknąć użycia rozszerzenia symboli wieloznacznych, które może zawieść w dużym katalogu.
Możesz użyć 'xargs' i ominąć' awk' + 'sh' (czuje się brzydko) lub prawdopodobnie użyć' find ... -exec' i uruchomić tylko jedno polecenie. – KurzedMetal
Mogę to znaleźć, ale zastanawiałem się, jak to zrobić, używając awk! – ThinkCode
Patrz [BashFAQ/003] (http://mywiki.wooledge.org/BashFAQ/003) i [BashFAQ/099] (http://mywiki.wooledge.org/BashFAQ/099). –