Lấy thư mục mới nhất (không phải tệp mới nhất)


15

Thư mục của tôi parentcó nội dung như sau:

A.Folder B.Folder C.File

Nó có cả thư mục và tập tin bên trong. B.Folderlà mới hơn. Bây giờ tôi chỉ muốn có được B.Folder, làm thế nào tôi có thể đạt được điều này? Tôi đã thử nó

ls -ltr ./parent | grep '^d' | tail -1

Nhưng nó cho tôi drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, nhưng tôi chỉ cần tên B.Folder.


1
sử dụng cái nàyls -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

Sử dụng awk hoạt động, nhưng tôi muốn xem có giải pháp nào sạch hơn không. :)
Daniel

tìm thấy . -maxdepth 1 -type d | TZ = utc xargs ls -ld --full-time | sắp xếp -k 6
ctrl-alt-delor

Câu trả lời:


24

Thử đi:

$ ls -td -- */ | head -n 1

-ttùy chọn lssắp xếp theo thời gian sửa đổi, mới nhất đầu tiên.

Nếu bạn muốn xóa /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

1
Làm thế nào để thoát khỏi dấu gạch chéo /?
Daniel

Điều này không hoạt động nếu bạn đang ở trong một thư mục khác. Ý tôi là ls -td -- ./parent | head -n 1không cho tôi kết quả chính xác, tôi CÓ PHẢI sử dụng subshell như cd ./parentmọi lần và thực hiện lệnh này không? Bất kỳ giải pháp?
Daniel

@Daniel: Bạn phải chạy câu trả lời của tôi trong thư mục làm việc hiện tại để làm cho nó hoạt động. Mặt khác, bạn phải sử dụng một đường dẫn tương đối như câu trả lời của Herson.
cuonglm

Loại bỏ cuối cùng / không hoạt động. Ví dụ: / home / cuo / bin / Dự kiến: / home / cuo / bin
Marius

5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Sự khác biệt đối với giải pháp của Herson là dấu gạch chéo sau *, làm cho trình bao bỏ qua tất cả các tệp không phải là thư mục. Khác với Gnouc , nó sẽ hoạt động nếu bạn ở trong một thư mục khác.

Cắt cần biết số lượng thư mục mẹ (2) để xóa dấu '/'. Nếu bạn không có điều đó, hãy sử dụng

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

3

Bắt buộc trả lời zsh:

latest_directory=(parent/*(/om[1]))

Các ký tự trong ngoặc đơn là vòng loại toàn cầu : /chỉ khớp các thư mục, omsắp xếp các kết quả khớp theo độ tuổi tăng dần và [1]chỉ giữ lại kết quả khớp đầu tiên (tức là mới nhất). Thêm Nnếu bạn muốn lấy một mảng trống (thông thường bạn sẽ có được mảng 1 phần tử) nếu không có thư mục con của parent.

Ngoài ra, giả sử rằng parentkhông chứa bất kỳ ký tự vỏ nào:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

Nếu bạn không có zsh nhưng bạn có các công cụ GNU gần đây (tức là Linux không nhúng hoặc Cygwin), bạn có thể sử dụng find, nhưng nó cồng kềnh. Đây là một cách:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

Có một giải pháp đơn giản với ls, hoạt động miễn là không có tên thư mục nào chứa dòng mới hoặc (trên một số hệ thống) các ký tự không in được:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}

2

Lệnh sau sẽ thực hiện công việc ngay cả trong trường hợp tên thư mục chứa khoảng trắng:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

Giải thích được cập nhật của nội dung trong backticks là:

  • . - thư mục hiện tại (bạn có thể muốn chỉ định một đường dẫn tuyệt đối ở đây)
  • -mindepth/-maxdepth - chỉ giới hạn lệnh find đối với các thư mục con của thư mục hiện tại
  • -type d - chỉ thư mục
  • -exec stat .. - đưa ra thời gian sửa đổi và tên của thư mục từ find được phân tách bằng một tab (và không phải là khoảng trắng)
  • sort -n -r |head -1 | cut -f2 - date sắp xếp thư mục và xuất ra toàn bộ tên của lần sửa đổi gần đây nhất (ngay cả khi có chứa một khoảng trống dưới dạng dấu phân cách mặc định cắt)

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.