Poinformuj, czy folder / plik jest ukryty w Mac OS X.


10

Wiem, że możesz ustawić lub wyłączyć ukrytą flagę folderu / pliku, wykonując chflags hidden foo.txti chflags nohidden foo.txt.

Ale czy w ogóle można powiedzieć, czy folder / plik jest obecnie ukryty, czy nie?

Nie chcę po prostu określać, czy folder / plik zaczyna się od kropki.

Odpowiedzi:


10

Zgodnie ze stroną podręcznika ls , powinieneś być w stanie -Opołączyć opcję z -lopcją przeglądania flag za pomocą ls. Na przykład:

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

Edycja: aby podać bardziej szczegółowe rozwiązanie tego, czego chciał OP (patrz komentarze poniżej): Aby sprawdzić, czy folder jest ukryty, możemy przekazać -aopcję ls, aby wyświetlić sam folder. Możemy następnie przesłać dane wyjściowe do sed -n 2p(dzięki przepełnieniu stosu ), aby uzyskać wymagany wiersz tego wyniku. Przykład:

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

Edycja 2: Dla polecenia, które powinno działać niezależnie od tego, czy jest to plik, czy folder, musimy zrobić coś nieco bardziej zhackowanego.

Wymagana linia danych wyjściowych ls -alróżni się w zależności od tego, czy rzecz jest plikiem, czy folderem, ponieważ foldery pokazują całkowitą liczbę, podczas gdy pliki nie. Aby obejść ten problem, możemy pozdrowić postać r. Powinno to znajdować się w ~ wszystkich plikach / folderach (prawie wszystkie powinny mieć co najmniej jedno uprawnienie do odczytu), ale nie w wierszu sum.

Ponieważ linia, którą chcemy uzyskać, staje się pierwszą linią, możemy użyć, head -n 1aby uzyskać pierwszą linię ( można użyć alternatywnej opcji, jeśli wolisz sed sed -n 1p).

Na przykład z katalogiem:

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 .

i z plikiem:

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

Edycja 3: Zobacz odpowiedź Tyilo poniżej dla lepszego sposobu niż szukanie r:)


Ale robiąc to z folderem, wyświetli flagi dla plików / folderów pod nim
Tyilo

Aby wyświetlić tylko ukryte pliki, przeciągnij go przez grep (np. ls -Ol fooDir/ | grep hidden), Aby wyświetlić tylko ukryte pliki / foldery. Nadal będą wyświetlać wszystkie pliki, ale jeśli przepuścisz je przez magię sed / awk (obawiam się, że ktoś inny będzie musiał ci pomóc), powinieneś być w stanie uzyskać tylko listę plików.

Nie chcę listy plików, które chcę tylko wiedzieć, że folder „foo” jest ukryty, czy nie
Tyilo

Ok. Aby wyświetlić sam katalog, dodaj -aopcję do ls. Aby uzyskać potrzebną linię z wyjścia, możesz użyć sed. Na przykład: ls -aOl foo | sed -n 2p. Spowoduje to wyświetlenie jednego wiersza wyniku. Jeśli zawiera słowo „ukryty”, to foo jest ukryty. Jeśli nie, foo nie jest ukryty. :)

2
Użycie ls -Old dirname/spowoduje wyświetlenie właściwości samego katalogu, a nie jego zawartości.
bahamat

7

Znalazłem rozwiązanie tutaj: Jak sprawić, aby ls wyświetlał informacje tylko o określonym katalogu, a nie informacje o jego podfolderach lub zawartości folderów?

Co w zasadzie jest, ls -ldO fooa następnie dodajesz, | awk '{ print $5 }'aby wyświetlać informacje.


1
Pamiętaj, że awk ulegnie awarii, jeśli w nazwie użytkownika lub nazwie grupy występuje spacja (co powinno być bardzo mało prawdopodobne, ale hej). Dodałem bezpieczniejsze rozwiązanie, które wykorzystuje stat.
mrm

1

Jak wskazuje @Tyilo , @Sorpigal sugeruje próbowanie stat, które koduje „flagi użytkownika” za pomocą %Xf(on koduje X użytkownika f lag) i jest znacznie bezpieczniejsze dla parsowania maszynowego.

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

Wartości szesnastkowe dla flagi użytkowników żyć tutaj: grep UF /usr/include/sys/stat.h. Począwszy od systemu 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 */
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.