Cách đặt ngày siêu dữ liệu đã thêm vào siêu dữ liệu trong Mac OS X 10.7 Lion


22

Trình tìm kiếm trong Mac OS X 10.7 Lion hiển thị một phần siêu dữ liệu tệp mới, "Ngày đã thêm", theo dõi ngày một mục được thêm vào thư mục. Sau khi nâng cấp lên 10.7, không có mục nào trong ~/Downloadsthư mục của tôi có giá trị "Ngày thêm". Tôi muốn đặt tất cả các giá trị "Ngày thêm" trống để khớp với các giá trị "Ngày đã sửa đổi", nhưng tôi không thể tìm ra cách đặt thuộc tính "Ngày đã thêm" thành một giá trị cụ thể.

Tôi đoán đầu tiên là thế này:

xattr -w com.apple.metadata:kMDItemDateAdded "2012-02-19 16:34:47 +0000" myfile

Nhưng điều đó dường như không hoạt động (mặc dù nó cũng không báo lỗi).


Bạn đã kết thúc việc tìm kiếm một giải pháp?
erotsppa

1
Câu trả lời được chấp nhận hoạt động khi tôi thử nó (điên như nó là).
John Siracusa

Câu trả lời:


7

OK, cách tiếp cận mới ở đây. Thận trọng: Tôi không có hệ thống được nâng cấp lên Lion (máy tính của tôi đã cài đặt Lion) vì vậy tôi không thể kiểm tra điều này. Mã chưa được kiểm tra; sao lưu trước khi thử mã này!

Câu trả lời trước của tôi dựa trên thứ tự sắp xếp được sử dụng bởi ngăn xếp Tải xuống trong Dock. Trường Ngày đã thêm trong Trình tìm kiếm dường như được dựa trên thông tin Spotlight, rất khó để hack. Nó cũng không thể truy cập thông qua AppleScript. Nhưng, dường như có một cách giải quyết.

  1. Tạo một quy trình làm việc mới trong Automator.

  2. Đặt quy trình công việc để chấp nhận các tệp hoặc thư mục từ Trình tìm kiếm bằng cách thêm các mục Yêu cầu của Finder Yêu cầu tìm kiếm.

  3. Có quy trình làm việc chạy AppleScript bằng cách thêm hành động của Run Run AppleScript.

Sử dụng AppleScript này:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges
    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x
            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s
            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges
            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges
    return input
end run

Chọn các tệp chưa có Ngày được thêm (sắp xếp theo Ngày đã thêm trong Trình tìm kiếm, sau đó chọn phần của danh sách mà không có Ngày đã thêm) và chạy dịch vụ này.

ảnh chụp màn hình của quy trình làm việc trong Automator


2
Đó là điều kinh khủng trong một cách tốt, có thể?
John Siracusa

1
Chà, chắc chắn là hack. Nhưng có vẻ như phần siêu dữ liệu cụ thể được tính toán từ Spotlight và không hack được bí ẩn đen tối nào được biết đến /.Spotlight-V100, điều này có thể tốt như nó có được. Nhưng tôi muốn yêu để xem một câu trả lời sạch.
Daniel

Tôi đang nhận được một lỗi kỳ lạ từ kịch bản này? sh: -c dòng 0: EOF bất ngờ trong khi tìm kiếm kết hợp `"
erotsppa

@erotsppa nó cần được sửa chữa và cập nhật ngay bây giờ.
Daniel

AppleScript đã dừng với một lỗi khi xử lý một tệp có $tên của nó, nhưng tôi đã khắc phục bằng cách tạm thời đổi tên tệp đó. Để làm cho AppleScript xử lý các tệp như vậy, các tìm kiếm của tôi cho biết rằng bạn có thể thay thế myfilebằng quoted form of myfile, nhưng tôi chưa kiểm tra điều đó. Nếu một người đã thử điều đó, có thể rõ ràng hơn để thực hiện trích dẫn khi cài đặt myfilevà đổi tên biến thành quotedFilePath.
Rory O'Kane

7

Khi tôi chạy xattr -ltrên các mục trong thư mục Tải xuống của mình, tôi nhận được một trường trông giống như thế này:

com.apple.metadata:kMDItemDownloadedDate:
00000000  62 70 6C 69 73 74 30 30 A1 01 33 41 B4 83 4D BF  |bplist00..3A..M.|
00000010  4C 4F E3 08 0A 00 00 00 00 00 00 01 01 00 00 00  |LO..............|
00000020  00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 13                                   |.....|
00000035

Đây là một số nhị phân. Khi tôi sử dụng HexFiend để tạo một tệp có các byte đó (vâng, tôi đã nhập chúng theo cách thủ công; nổ từ quá khứ như nhập mã trình biên dịch ra khỏi tạp chí vào Apple] [GS), sau đó lưu nó dưới dạng tệp .plist, tôi đã mở tệp trong TextWrangler và có xml chưa được biên dịch sau:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <date>2011-11-28T05:03:59Z</date>
</array>
</plist>

Điều đó nói rằng, trong khi Apple dường như lưu trữ các ngày trong XML đã biên dịch, văn bản thuần túy dường như hoạt động.

Nói cách khác, nếu bạn có thể lấy ngày sửa đổi của tệp ở dạng chuỗi, bạn có thể chạy lệnh xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" fileđể thay đổi "ngày đã tải xuống", có vẻ như là trường thực sự được sắp xếp trên, không phải là Ngày thực tế được thêm vào.

Cuối cùng, bạn không gặp lỗi khi thêm trường (không sử dụng) kMDItemDateAddedbởi vì, như tôi đã học trong bài viết này , xattrsẽ vui vẻ đặt bất kỳ trường siêu dữ liệu nào bạn muốn, sử dụng hoặc không sử dụng.

Đó là cốt lõi của câu trả lời. Tôi sẽ viết AppleScript để lấy ngày sửa đổi cho mỗi tệp, kiểm tra xem có kMDItemDownloadedDateđược đặt không và nếu không, hãy đặt kMDItemDoadedDate thành ngày đã sửa đổi, nhưng tôi muốn lấy cốt lõi của câu trả lời được đăng.


1
Chạy mdls trên các tệp trong thư mục Tải xuống của bạn và bạn sẽ thấy các giá trị kMDItemDateAdded. Đó là những gì cột "Ngày thêm" trong chế độ xem Danh sách của Trình tìm kiếm hiển thị.
John Siracusa

Ngẫu nhiên, nếu bạn muốn hiển thị kMDItemDoadedDate dưới dạng thông tin chính mà không thông qua HexFiend và TextWrangler, hãy thử xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Xxd chuyển đổi thành dữ liệu plist nhị phân, sau đó plutilchuyển đổi thành plist XML và in nó.
Matt Gibson

OK, tôi ở trên đầu của tôi, tôi sợ nói. kMDItemDateAdded không được liệt kê trong xattr -lvà kMDItemDoadedDate không được liệt kê với mdls. Tò mò và tò mò hơn. Không phải trường Ngày thêm được lưu trữ trong xattr cho thư mục . Siêu dữ liệu này sống ở đâu?
Daniel

1
xattrlà một kịch bản python, tôi đoán rằng có thể chọc vào tập lệnh này và tìm ra cách lấy dữ liệu nhị phân của thuộc tính trong nhị phân, thay vì hex, vì vậy bạn có thể cung cấp trực tiếp cho nó plutil.
Harald Hanche-Olsen

4

Tôi không thể tìm cách đặt "Ngày đã thêm" được hiển thị trong Finder.

Tôi tin rằng bạn đã chính xác rằng nó được truy xuất từ kMDItemDateAddedthuộc tính siêu dữ liệu của chỉ số Spotlight . Tuy nhiên, Spotlight dường như xuất phát từ chính nó theo một cách nào đó.

Tôi đã thử thiết lập một thuộc tính tệp mở rộng được gọi là com.apple.metadata:kMDItemDateAddedgiá trị ngày theo một trong một số định dạng khác nhau, bao gồm định dạng được sử dụng kMDItemDateAddedvà không có định dạng nào được chọn bởi chỉ số Spotlight, tức là cho dù giá trị được hiển thị bởi xattrgiá trị nào hiển thị bởi mdlskhông thay đổi.

Tôi đoán , mặc dù tôi không biết chắc chắn, Spotlight chỉ đơn giản là đặt ngày này dựa trên lần đầu tiên nó lập chỉ mục một tệp ở một vị trí cụ thể và không kiểm tra bất kỳ siêu dữ liệu nào khác để tạo ra nó. Nếu bạn lấy mvmột tệp ra khỏi Tải xuống và quay lại, Ngày cập nhật sẽ cập nhật khi nó được chuyển trở lại, nhưng không có siêu dữ liệu tệp nào bị ảnh hưởng, chỉ có siêu dữ liệu Spotlight.

Vì vậy, tóm lại, tôi cho rằng Ngày đã thêm chỉ được lưu trữ ở đâu đó trong phần khá khó hiểu của /.Spotlight-V100, và trừ khi ai đó có thể đưa ra cách nói với Spotlight để cập nhật mục nhập siêu dữ liệu thành giá trị tùy ý, tôi có thể ' t thấy một cách làm việc này


Tiêu điểm! Làm tốt.
Daniel

4

Cảm ơn Daniel Lawson cho giải pháp! Nó vẫn hoạt động tốt, thậm chí hai năm sau.

Tôi có hai bổ sung:

1) Xin lưu ý rằng có một lỗi nhỏ trong mã của câu trả lời được chấp nhận.

Đường thẳng này:

do shell script "/usr/sbin/systemsetup -settime ''" & tm & "'"

... có thêm dấu nháy đơn, gây ra lỗi "EOF bất ngờ". Nó nên đọc:

do shell script "/usr/sbin/systemsetup -settime '" & tm & "'"

2) Quan trọng hơn, bắt đầu với Mavericks 10.9.2, systemsetup yêu cầu quyền quản trị viên. Vì vậy, mọi lệnh gọi shell script nên tuân theo công thức này:

do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

Đây là phiên bản sửa đổi đầy đủ của AppleScript, được xác nhận hoạt động trong 10.9.3:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x

            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s

            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges

            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell

    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges

    return input
end run

1
Chào mừng bạn đến hỏi khác nhau! Thay vì viết câu trả lời để chỉnh sửa câu trả lời của người khác, chỉ cần nhấp vào chỉnh sửa hoặc cải thiện nút trả lời này bên dưới bài đăng mà bạn muốn cải thiện .
grg

Câu trả lời của Daniel đã được chỉnh sửa để bao gồm những thay đổi này.
Rory O'Kane
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.