web-dev-qa-db-ja.com

フォルダ/ファイルがMacOSXで非表示になっているかどうかを確認する

chflags hidden foo.txtおよびchflags nohidden foo.txtを実行すると、フォルダー/ファイルの非表示フラグを設定または設定解除できることを知っています。

しかし、フォルダ/ファイルが現在非表示になっているかどうかを知る方法はありますか?

フォルダ/ファイルがドットで始まっているかどうかだけを判断したくありません。

10
Tyilo

lsのマニュアルページ によると、-Oオプションを-lオプションと組み合わせて、lsでフラグを表示できるはずです。例えば:

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

編集:OPが望んでいたものにさらに具体的な解決策を与えるために(以下のコメントを参照):フォルダーが非表示になっているかどうかを確認するには、-aオプションをlsに渡してフォルダー自体を表示します。次に、出力をsed -n 2pにパイプして(ありがとう Stack Overflow )、その出力の必要な行を取得できます。例:

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

編集2:ファイルかフォルダーかに関係なく機能するコマンドの場合、もう少しハッキーなことをする必要があります。

ls -alからの必要な出力行は、ファイルがファイルであるかフォルダーであるかによって異なります。フォルダーには合計数が表示されますが、ファイルには表示されないためです。これを回避するために、文字rをgrepできます。これは、〜すべてのファイル/フォルダーに含まれている必要があります(ほぼすべてに少なくとも1つの読み取りアクセス許可が必要です)が、合計行には含まれていません。

取得したい行が最初の行になるので、head -n 1を使用して最初の行を取得できます(または、sedが必要な場合は、sed -n 1pを使用できます)。

したがって、たとえばディレクトリの場合:

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 .

とファイルで:

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

編集3:rをgrepするよりも良い方法については、以下のTyiloの回答を参照してください:)

10
hrickards

ここで解決策を見つけました: サブファイルやフォルダの内容に関する情報ではなく、指定されたディレクトリに関する情報のみをlsに表示させるにはどうすればよいですか?

これは基本的にls -ldO fooであり、次に| awk '{ print $5 }'を追加して情報を表示します。

7
Tyilo

@ Tyilo で参照されているように、 @ Sorpigal は、「ユーザーフラグ」を%Xfでエンコードするstatを試すことを提案しています(he [〜#〜] x [〜#〜]エンコードされたユーザーf lag)、マシン解析の方がはるかに安全です。

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

ユーザーフラグの16進値はここにあります:grep UF /usr/include/sys/stat.h。 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 */
1
mrm