Làm thế nào để có được các đường dẫn tương đối với ls?


8

Tôi muốn làm một cái gì đó như thế này để di chuyển hai tệp được tải xuống cuối cùng:

mv ` ls -rt ~/Downloads/ | tail -2 ` .

Thật không may, lschỉ cung cấp tên tập tin. Làm thế nào tôi có thể thích ứng mã ở trên?

(Trước khi ai đó chỉ ra, tôi nhận thức được các vấn đề trong đường ống đầu ra ls. Tôi chỉ sử dụng điều này khi tôi biết tên tệp được đề cập.)


9
Sử dụng findthay thế.
Ignacio Vazquez-Abrams

Câu trả lời:


10

Được rồi, vì vậy nếu bạn sẽ không từ bỏ ls, thì ít nhất hãy cố gắng bỏ thói quen sử dụng backticks cho mọi thứ, đặc biệt là khi xargsphù hợp hơn:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .

Bạn xargslàm tôi hài lòng hơn backticks. Nhưng có bất kỳ lý do kỹ thuật nào để thích chuỗi ống này và xargshơn việc sử dụng backticks hay đây chỉ là vấn đề của hương vị?
phép lạ173

Trong trường hợp này, chúng tôi chỉ xem xét hai tệp, nhưng nếu chúng tôi muốn di chuyển hàng ngàn tệp, chúng tôi có thể vô tình cố gắng tạo một dòng lệnh quá dài.
geocar

Ngoài ra: Trong trường hợp chỉ có hàng trăm tệp, chúng tôi có thể bắt đầu làm việc ngay lập tức. Với backticks, chúng ta phải đợi cho đến khi toàn bộ tiểu ban kết thúc.
geocar

Ngoài ra: Khi bạn quản lý để từ bỏ thói quen sử dụng ls, bạn có thể tận dụngxargs -0
geocar

3
Phân tích cú pháp lskhông được khuyến khích: mywiki.wooledge.org/ParsingLs
Gilles Quenot

8

Bạn có thể sử dụng GNU findở đó:

mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .

Các find -printftùy chọn:

  • %Tsđể hiển thị thời gian dưới dạng kỷ nguyên
  • %p đường dẫn tập tin

Xem man find | less +/'^ *-printf'

biên tập

nếu bạn cần xử lý khoảng trắng trong tên tệp, tôi khuyên bạn nên giải pháp này:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .

Đã thêm giải thích về find -printfcác tùy chọn
Gilles Quenot

1
Tôi tò mò: có bất kỳ lý do cụ thể để sử dụng -f2-thay vì -f2như là một tùy chọn cutkhông? Dấu gạch ngang thứ hai để làm gì?
Francesco Turco

1
Chắc chắn Francesco Turco, như đã nói man cut, nó in cho đến cuối nếu có nhiều hơn một col.
Gilles Quenot

POST được chỉnh sửa để làm việc với tên tệp có dấu cách.
Gilles Quenot

3

Sử dụng ls -rt ~/Downloads/*thay vì ls -rt ~/Downloads/. Trong ls -rt ~/Downloads/*chuỗi đối số được mở rộng đầu tiên bởi shell (cái này được gọi là tên tệp globalbing ). Vì vậy, bạn nhận được một danh sách các đường dẫn làm đối số cho ls -rtlệnh, sau đó sắp xếp nó theo cách bạn chỉ định theo các tùy chọn ls. Ngược lại, lệnh ls -rt ~/Downloads/đọc nội dung của thư mục ~/Downloads/. Đây là danh sách các tập tin không có đường dẫn thư mục.


2

Với zsh:

mv ~/Downloads/*(.om[1,2]) .

Phần (...)này được gọi là vòng loại toàn cầu , một trong những tính năng giết người của zsh. Mỗi vòng loại (thường là các ký tự đơn) cho phép lọc các mục phù hợp dựa trên các thuộc tính của tệp (loại, kích thước, thời gian ...), thay đổi thứ tự chúng được mở rộng hoặc sửa đổi cách chúng được mở rộng.

Ở trên, chúng tôi đã có:

  • . (dấu chấm): chỉ chọn các tệp thông thường (không phải thư mục, liên kết tượng trưng ...)
  • om: o rder danh sách theo thời gian m m .
  • [1,2]: chỉ chọn hai mục đầu tiên.

Cũng lưu ý rằng lệnh sẽ thất bại nếu không có kết quả khớp (trong đó các shell khác có thể vô tình di chuyển tệp / dir sai).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.