Katakan apakah folder / file disembunyikan di Mac OS X

10

Saya tahu Anda dapat mengatur atau menghapus flag yang tersembunyi dari folder / file dengan melakukan chflags hidden foo.txtdan chflags nohidden foo.txt.

Tetapi apakah ada pula yang memberitahukan apakah folder / file saat ini disembunyikan atau tidak?

Saya tidak ingin menentukan apakah folder / file diawali dengan titik.

Tyilo
sumber

Jawaban:

10

Menurut halaman manual ls , Anda harus dapat -Odikombinasikan dengan -lopsi untuk melihat flag dengan ls. Sebagai contoh:

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

Sunting: Hanya untuk memberikan solusi yang lebih spesifik untuk apa yang diinginkan OP (lihat komentar di bawah): Untuk melihat apakah folder disembunyikan atau tidak, kita dapat memberikan -aopsi kepada ls untuk melihat folder itu sendiri. Kami kemudian dapat menyalurkan output ke sed -n 2p(terima kasih Stack Overflow ) untuk mendapatkan garis yang diperlukan dari output itu. Sebuah contoh:

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

Sunting 2: Untuk perintah yang seharusnya berfungsi terlepas dari apakah itu file atau folder, kita perlu melakukan sesuatu yang sedikit lebih meretas.

Garis keluaran yang diperlukan ls -albervariasi tergantung pada apakah benda itu berupa file atau folder, karena folder menunjukkan jumlah total, sedangkan file tidak. Untuk menyiasati ini, kita dapat memahami karakter r. Ini harus di ~ semua file / folder (hampir semua harus memiliki setidaknya satu izin baca), tetapi tidak di baris total.

Karena baris yang ingin kita dapatkan kemudian menjadi baris pertama, kita dapat menggunakan head -n 1untuk mendapatkan baris pertama (alternatif, jika Anda lebih suka sed, sed -n 1pbisa digunakan).

Jadi, misalnya dengan direktori:

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 .

dan dengan file:

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

Sunting 3: Lihat jawaban Tyilo di bawah ini untuk cara yang lebih baik daripada menerima r:)

bajingan
sumber
Tetapi melakukan hal ini dengan sebuah folder, akan mencantumkan flag untuk file / folder di bawahnya
Tyilo
Untuk hanya melihat file yang tersembunyi, pipa melalui grep (misalnya ls -Ol fooDir/ | grep hidden) untuk melihat hanya file / folder yang tersembunyi. Ini masih akan menampilkan semua file, tetapi jika Anda menyalurkannya melalui beberapa sihir sed / awk (orang lain harus membantu di sini, saya khawatir) Anda harus bisa mendapatkan hanya daftar file.
Saya tidak ingin daftar file yang saya hanya ingin tahu adalah folder "foo" disembunyikan atau tidak
Tyilo
Baik. Jadi untuk melihat direktori itu sendiri tambahkan -aopsi ke ls. Untuk mendapatkan garis yang Anda butuhkan dari output, Anda dapat menggunakan sed. Sebagai contoh: ls -aOl foo | sed -n 2p. Ini akan menampilkan satu baris output. Jika itu mengandung kata "tersembunyi", maka foo disembunyikan. Jika tidak, foo tidak disembunyikan. :)
2
Menggunakan ls -Old dirname/akan menunjukkan kepada Anda properti direktori itu sendiri, bukan isinya.
bahamat
7

Temukan solusinya di sini: Bagaimana saya bisa membuat saya menunjukkan informasi tentang direktori yang ditentukan saja, bukan info tentang sub-file atau isi foldernya?

Yang pada dasarnya adalah ls -ldO foodan kemudian Anda hanya menambahkan | awk '{ print $5 }'agar menampilkan informasi.

Tyilo
sumber
1
Ketahuilah bahwa awk akan pecah jika ada spasi putih di nama pengguna atau nama grup (yang seharusnya sangat tidak mungkin, tapi hei). Saya menambahkan solusi yang lebih aman yang digunakan stat.
mrm
1

Seperti yang dirujuk oleh @ Tyilo , @Sorpigal menyarankan untuk mencoba stat, yang menyandikan "flag pengguna" dengan %Xf(ia X menyandikan pengguna f lag), dan jauh lebih aman untuk parsing mesin.

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

Nilai-nilai hex untuk bendera pengguna tinggal di sini: grep UF /usr/include/sys/stat.h. Mulai dari 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 */
mrm
sumber