2012-05-15 18 views
6

Al moje pliki html rezydują tutaj:Jak skopiować 10 najświeższych plików z jednego katalogu do drugiego?

/home/thinkcode/myfiles/html/ 

Chcę przenieść najnowsze 10 plików /home/thinkcode/Test

mam to tak daleko. Proszę mnie poprawić. Szukam jednego liniowca!

ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh 
+3

Możesz użyć 'xargs' i ominąć' awk' + 'sh' (czuje się brzydko) lub prawdopodobnie użyć' find ... -exec' i uruchomić tylko jedno polecenie. – KurzedMetal

+0

Mogę to znaleźć, ale zastanawiałem się, jak to zrobić, używając awk! – ThinkCode

+3

Patrz [BashFAQ/003] (http://mywiki.wooledge.org/BashFAQ/003) i [BashFAQ/099] (http://mywiki.wooledge.org/BashFAQ/099). –

Odpowiedz

9
ls -lt *.htm | head -10 | awk '{print "cp " $9 " ../Test/"$9}' | sh 
+5

'ls' jest notorycznie złe pod względem umieszczania nazw plików zawierających specjalne znaki. Również parsowanie wyjścia 'ls -l 'jest pełne niebezpieczeństw. Lepiej napisać mały skrypt perlowy, który będzie analizował wszystkie pliki i sortował wyniki według daty. Jeśli musisz użyć 'ls', odrzuć przynajmniej argument' -l' ... ls -t * .html | head -10' działałby równie dobrze. –

4
ls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir 

W powyższym przykładzie DestDir jest katalog docelowy dla kopii.

Dodaj po Xargs -t, aby zobaczyć polecenia podczas ich wykonywania. Tj. xargs -i -t cp {} DestDir.

Aby uzyskać więcej informacji, sprawdź numer xargs command.

EDIT: Jak podkreślił @DennisWilliamson (a także sprawdzenie bieżącej strony man) ponownie opcję This option is deprecated; use -I instead.-i.

Ponadto oba prezentowane rozwiązania zależą od nazw plików w pytaniach, które nie zawierają żadnych spacji ani tabulatorów.

+0

jak skopiować pliki do katalogu ../test? – ThinkCode

+0

ls -lt * .htm | głowa -10 | awk '{print $ NF}' | xargs cp * ../Test/? Nie działa. Jak zebrać nazwy plików z potoku i podać do polecenia kopiowania? – ThinkCode

+0

To '{}', nie '*' –

6

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.

+3

+1 za nie używanie ls. Może być nieco prostsze: 'stat -c"% Y \ t% n "* .html | sort -n | ogon -10 | cut -d "" -f 2- | xargs cp -t ../ Test' –

+0

@glennjackman: czy znak skrótu na tabulacji jest drukowany jako "" podczas wklejania? – ToolmakerSteve

+0

Dobra uwaga. Powinno to być 'cut -d $ '\ t' ...' –

Powiązane problemy