Cho biết nếu một thư mục / tệp bị ẩn trong Mac OS X


10

Tôi biết bạn có thể đặt hoặc hủy đặt cờ ẩn của thư mục / tệp bằng cách thực hiện chflags hidden foo.txtchflags nohidden foo.txt.

Nhưng liệu có cách nào để biết liệu thư mục / tập tin hiện đang bị ẩn hay không?

Tôi không muốn xác định xem thư mục / tập tin có bắt đầu bằng dấu chấm không.

Câu trả lời:


10

Theo trang man ls , bạn sẽ có thể -Otùy chọn kết hợp với -ltùy chọn để xem cờ với ls. Ví dụ:

ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt
chflags hidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt
chflags nohidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt

Chỉnh sửa: Chỉ để đưa ra một giải pháp cụ thể hơn cho những gì OP muốn (xem bình luận bên dưới): Để xem thư mục có bị ẩn hay không, chúng ta có thể chuyển -atùy chọn cho ls để xem chính thư mục đó. Sau đó chúng ta có thể dẫn đầu ra vào sed -n 2p(nhờ Stack Overflow ) để có được dòng yêu cầu của đầu ra đó. Một ví dụ:

mkdir foo
chflags hidden foo
ls -aOl foo | sed -n 2p
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

Chỉnh sửa 2: Đối với một lệnh sẽ hoạt động bất kể đó là tệp hay thư mục, chúng ta cần thực hiện một số thứ hơi hack hơn.

Dòng đầu ra cần thiết ls -alkhác nhau tùy thuộc vào việc vật đó là tệp hay thư mục, vì các thư mục hiển thị tổng số, trong khi các tệp thì không. Để giải quyết vấn đề này, chúng ta có thể grep cho nhân vật r. Điều này phải có trong ~ tất cả các tệp / thư mục (gần như tất cả phải có ít nhất một quyền đọc), nhưng không phải trong dòng tổng.

Khi dòng chúng tôi muốn nhận sau đó trở thành dòng đầu tiên, chúng tôi có thể sử dụng head -n 1để có được dòng đầu tiên (thay thế, nếu bạn thích sed, sed -n 1pcó thể được sử dụng).

Vì vậy, ví dụ với một thư mục:

mkdir foo
chflags hidden foo
ls -aOl foo | grep r | head -n 1
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

và với một tập tin:

touch foo.txt
chflags hidden foo.txt
ls -aOl foo.txt | grep r | head -n 1
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt

Chỉnh sửa 3: Xem câu trả lời của Tyilo bên dưới để biết cách tốt hơn so với grepping cho r:)


Nhưng làm điều này với một thư mục, sẽ liệt kê các cờ cho các tệp / thư mục trong đó
Tyilo

Để chỉ xem các tệp bị ẩn, chuyển nó qua grep (ví dụ ls -Ol fooDir/ | grep hidden) để chỉ xem các tệp / thư mục bị ẩn. Điều này sẽ vẫn hiển thị tất cả các tệp, nhưng nếu bạn chuyển nó qua một số phép thuật sed / awk (người khác sẽ phải giúp đỡ ở đây tôi sợ) bạn sẽ có thể nhận được một danh sách các tệp.

Tôi không muốn một danh sách các tập tin tôi chỉ muốn biết là thư mục "foo" có bị ẩn hay không
Tyilo

Đồng ý. Vì vậy, để xem thư mục chính nó thêm -atùy chọn vào ls. Để chỉ nhận được dòng bạn cần từ đầu ra, bạn có thể sử dụng sed. Ví dụ : ls -aOl foo | sed -n 2p. Điều này sẽ hiển thị một dòng đầu ra. Nếu nó chứa từ "ẩn", thì foo bị ẩn. Nếu không, foo không bị ẩn. :)

2
Sử dụng ls -Old dirname/sẽ cho bạn thấy các thuộc tính của chính thư mục, không phải nội dung của nó.
bahamat

7

Tìm thấy giải pháp ở đây: Làm thế nào tôi có thể làm cho ls hiển thị thông tin về thư mục được chỉ định, không phải thông tin về các tệp phụ hoặc nội dung thư mục của nó?

Mà về cơ bản là ls -ldO foovà sau đó bạn chỉ cần thêm | awk '{ print $5 }'vào để làm cho nó hiển thị thông tin.


1
Xin lưu ý rằng awk sẽ bị hỏng nếu có khoảng trắng trong tên người dùng hoặc tên nhóm (điều này cực kỳ khó xảy ra, nhưng hey). Tôi đã thêm một giải pháp an toàn hơn mà sử dụng stat.
mrm

1

Như tham chiếu bởi @Tyilo , @Sorpigal đề nghị cố gắng stat, mã hóa "cờ của người dùng" với %Xf(ông X được mã hóa sử dụng f lag), và an toàn hơn nhiều cho máy phân tích cú pháp.

$ stat -f "%Xf" ~/Library
8000

Các giá trị hex cho cờ người dùng sống ở đây : grep UF /usr/include/sys/stat.h. Kể từ macOS 10.11:

#define UF_SETTABLE     0x0000ffff  /* mask of owner changeable flags */
#define UF_NODUMP       0x00000001  /* do not dump file */
#define UF_IMMUTABLE    0x00000002  /* file may not be changed */
#define UF_APPEND       0x00000004  /* writes to file may only append */
#define UF_OPAQUE       0x00000008  /* directory is opaque wrt. union */
/* #define UF_NOUNLINK  0x00000010 */   /* file may not be removed or renamed */
#define UF_COMPRESSED   0x00000020  /* file is hfs-compressed */
/* UF_TRACKED is used for dealing with document IDs.  We no longer issue
   notifications for deletes or renames for files which have UF_TRACKED set. */
#define UF_TRACKED      0x00000040
#define UF_HIDDEN       0x00008000  /* hint that this item should not be */
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.