2012-05-15 43 views
6

Al file html của tôi cư trú ở đây:Làm cách nào để sao chép 10 tệp gần đây nhất từ ​​thư mục này sang thư mục khác?

/home/thinkcode/myfiles/html/ 

tôi muốn chuyển 10 file mới nhất để /home/thinkcode/Test

Tôi có điều này cho đến nay. Hãy sửa tôi. Tôi đang tìm kiếm một lớp lót!

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

Bạn có thể sử dụng 'xargs' và tránh' awk' + 'sh' (cảm thấy xấu xí) hoặc có thể sử dụng' find ... -exec' và chỉ chạy một lệnh. – KurzedMetal

+0

Tôi có thể thực hiện tìm kiếm nhưng chỉ tự hỏi làm thế nào để làm tương tự bằng cách sử dụng awk! – ThinkCode

+3

Vui lòng xem [BashFAQ/003] (http://mywiki.wooledge.org/BashFAQ/003) và [BashFAQ/099] (http://mywiki.wooledge.org/BashFAQ/099). –

Trả lời

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

'ls' nổi tiếng là xấu về việc liệt kê các tên tệp có các ký tự đặc biệt trong chúng. Ngoài ra, phân tích cú pháp đầu ra của 'ls -l' là đầy nguy hiểm. Tốt hơn là viết một tập lệnh perl nhỏ sẽ thống kê tất cả các tệp và sắp xếp kết quả theo ngày. Nếu bạn phải sử dụng 'ls', ít nhất là bỏ qua đối số' -l' ... 'ls -t * .html | head -10' cũng sẽ hoạt động tốt. –

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

Trong ví dụ trên DestDir là thư mục đích cho bản sao.

Thêm -t sau xarg để xem các lệnh khi chúng thực thi. I.e, xargs -i -t cp {} DestDir.

Để biết thêm thông tin, hãy xem xargs command.

EDIT: Như được chỉ ra bởi @DennisWilliamson (và cũng kiểm tra trang người dùng hiện tại), hãy chọn tùy chọn -iThis option is deprecated; use -I instead..

Ngoài ra, cả hai giải pháp được trình bày tùy thuộc vào tên tệp trong câu hỏi không chứa bất kỳ khoảng trống hoặc tab nào.

+0

cách sao chép các tệp vào thư mục ../test? – ThinkCode

+0

ls -lt * .htm | đầu -10 | awk '{print $ NF}' | xargs cp * ../Test/? Không hoạt động. Làm thế nào để thu thập các tên tập tin từ đường ống và nạp vào lệnh sao chép? – ThinkCode

+0

đó là '{}', không phải '*' –

6

Đây là phiên bản không sử dụng ls. Nó nên được ít dễ bị tổn thương với những nhân vật kỳ lạ trong tên tập tin:

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/ 

tôi đã sử dụng find cho một vài lý do:

1) nếu có quá nhiều file trong một thư mục, bash sẽ gặp khó khăn ở các ký tự đại diện sự bành trướng*.

2) Sử dụng đối số -print0 để find khắc phục sự cố bash mở rộng khoảng trống trong tên tệp trong nhiều mã thông báo.

* Thực ra, bash chia sẻ bộ nhớ đệm để mở rộng ký tự đại diện và biến môi trường của nó, vì vậy nó không phải là chức năng của số lượng tên tệp mà là tổng chiều dài của tên tệp và biến môi trường. Quá nhiều biến môi trường => không mở rộng ký tự đại diện.

EDIT: Kết hợp một số cải tiến của @ glennjackman. Giữ việc sử dụng ban đầu find để tránh việc sử dụng mở rộng ký tự đại diện có thể bị lỗi trong một thư mục lớn.

+3

+1 không sử dụng ls. Có thể đơn giản hơn một chút: 'stat -c"% Y \ t% n "* .html | sắp xếp -n | đuôi -10 | cut -d "" -f 2- | xargs cp -t ../ Kiểm tra ' –

+0

@glennjackman: là cắt tại ký tự tab, được in dưới dạng "" khi bạn dán? – ToolmakerSteve

+0

Điểm tốt. Nó phải là 'cut -d $ '\ t' ...' –

Các vấn đề liên quan