Sắp xếp các tệp trong thư mục theo cách đệ quy dựa trên ngày sửa đổi cuối cùng


11

Sắp xếp các tệp trong thư mục theo cách đệ quy dựa trên ngày sửa đổi cuối cùng

Tôi đã sửa đổi rất nhiều tệp trong thư mục của mình muốn biết những tệp đó là gì bằng cách sắp xếp chúng theo ngày sửa đổi gần nhất và trong đó tôi muốn loại bỏ một số tiện ích mở rộng

trong thư mục svn tôi cũng có rất nhiều tệp .svn mà tôi không muốn hiển thị trong sắp xếp


Tôi demo làm thế nào để loại trừ phần mở rộng trong câu trả lời của tôi.
mikeerv

Câu trả lời:


18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

sẽ cung cấp cho bạn một cái gì đó như

2014 / 03-31 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar


Tôi có thể loại trừ một phần mở rộng tập tin khỏi thư mục không ....
Danny

@Danny Vâng, thật dễ dàng với find : find -not -iname '*.ext'.
n.st

tìm -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | sắp xếp - đây chính xác là những gì tôi cần, cảm ơn rất nhiều @ n.st
Danny

5

Nếu bạn muốn làm phẳng cấu trúc thư mục (do đó sắp xếp theo ngày trên tất cả các tệp trong tất cả các thư mục, bỏ qua thư mục nào các tệp nằm trong) thì find-approach được đề xuất bởi @yeti là cách tốt nhất. Nếu bạn muốn giữ cấu trúc thư mục, bạn có thể thử

$ ls -ltR /path/to/directory

mà sắp xếp thư mục dựa.


1
điều này mang lại cho tôi thư mục khôn ngoan khi mà những gì tôi cần là tất cả các tập tin được sửa đổi gần đây
Danny

5

Trong bash, chạy shopt -s globstartrước. Trong ksh93, chạy set -o globstarđầu tiên. Trong zsh, bạn đã được đặt.

ls -dltr **/*

Điều này sẽ trả về một lỗi nếu bạn có quá nhiều tệp khiến giới hạn độ dài dòng lệnh trên hệ thống của bạn bị vượt quá. Trong zsh, bạn có thể sử dụng điều này thay thế:

print -rl -- **/*(Om)

Đây là câu trả lời duy nhất ở đây hoạt động cho Solaris 10, cảm ơn! :)
laxxy

3

Giả sử bạn đang sử dụng GNU, hãy thử:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

1
Bạn có thể sử dụng tùy chọn findcủa mình -printfđể tránh gọi một quy trình riêng (hoặc một số, tùy thuộc vào số lượng tệp). Xem câu trả lời của tôi cho một ví dụ.
n.st

1
Biết rằng có nhiều cách khác để làm điều đó, tôi muốn cho statmột cơ hội thể hiện -exec ... +. Có thật không! Đôi khi tôi nghĩ, statđáng được chú ý hơn ... và không ai nên nhận công thức nấu ăn từ đây mà không đọc về các thành phần và suy nghĩ về hậu quả ...

Btw ... không phải mọi tìm kiếm đều có -printf...

1
@yeti - Nếu bạn findkhông có -printf, bạn có thể sử dụng -exec sh -c 'printf...'để có được nhiều chức năng tương tự. Điều đó sẽ bao gồm quyền truy cập $(pwd)cho các đường dẫn đủ điều kiện là tốt.
mikeerv

2
Tôi đã gặp rất nhiều người dùng linux chưa bao giờ đọc về stat. Vì vậy, đôi khi tôi chỉ muốn hướng sự chú ý vào stat... Tôi nghĩ rằng statnó xứng đáng ...

2

Để liệt kê mạnh mẽ tên tệp chỉ bằng các công cụ GNU gần đây:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Điều này tránh mọi vấn đề về danh sách đối số vì đối số duy nhất lssẽ nhận được là tên của thư mục bạn muốn liệt kê. Bạn có thể làm điều này với bất cứ điều gì bạn thích.

Vỏ chỉ . sources|pipenhư một kịch bản shell - đó là quá trình tương tự và không có vấn đề bạn có thể gặp phải khi execveđược gọi.

Trong mọi trường hợp - ở trên chỉ đi ba chiều sâu mà có thể điều chỉnh bằng cách thay đổi maxdepth. Nó cũng sâu trước - vì vậy bạn làm việc ngược từ thư mục hiện tại của bạn depth.

Bạn có thể nhận thấy bạn cũng nhận được $LSCOLORS- trên máy của tôi, nó cũng cung cấp các cột được in gọn gàng và mọi thứ bạn muốn từ ls- hoặc, đối với vấn đề đó, bất cứ điều gì bạn có thể tưởng tượng bạn muốn làm với. source.

KHÔNG SVN

Một lần nữa, điều này sẽ làm bất cứ điều gì bạn mong đợi ls. Vì vậy, ẩn .svntập tin đơn giản như thay đổi lsdòng thành:

ls -t --color=always --hide="*svn" "%p"\n

Hoặc nếu bạn muốn xem các svnphần mở rộng trong mọi thư mục NHƯNG ./svnbạn có thể thay đổi nó để toàn bộ lệnh trông như thế này:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Cá nhân, tôi thích nó với ls -svà, nếu bạn quan tâm, -usẽ sắp xếp theo thời gian truy cập thay vì thời gian mod.


1

Cái này sẽ liệt kê tất cả files trong đó <dir>trên cùng được sửa đổi lâu đời nhất

find <dir> -type f -print0 | xargs -0 ls -ltr

Và với điều này, sửa đổi mới nhất là trên cùng

find <dir> -type f -print0 | xargs -0 ls -lt

Lưu ý rằng điều này chỉ hoạt động nếu danh sách tên tệp không vượt quá giới hạn độ dài dòng lệnh trên hệ thống của bạn.


đúng, tôi đã quên điều đó
UnX

để tham khảo về lệnh: danh sách arg quá dài in-ulm.de/~mascheck/various/argmax
UnX

@Gilles: Ý bạn là xargs -0(trong cả hai trường hợp).  xargs -print0tương đương với xargs -p -r -i -n -t -0hoặc xargs -inprt0hoặc xargs -0ntrip, có lẽ không phải là ý bạn.
Scott
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.