Risposte:
Secondo la pagina man ls , dovresti essere in grado di -O
combinare l' -l
opzione con l' opzione per visualizzare i flag con ls. Per esempio:
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
Modifica: solo per dare una soluzione più specifica a ciò che l'OP voleva (vedi commenti sotto): per vedere se una cartella è nascosta o meno, possiamo passare l' -a
opzione a ls per visualizzare la cartella stessa. Possiamo quindi reindirizzare l'output in sed -n 2p
(grazie Stack Overflow ) per ottenere la linea richiesta di tale output. Un esempio:
mkdir foo
chflags hidden foo
ls -aOl foo | sed -n 2p
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .
Modifica 2: per un comando che dovrebbe funzionare indipendentemente dal fatto che sia un file o una cartella, dobbiamo fare qualcosa di leggermente più complicato.
La linea di output necessaria ls -al
varia a seconda che si tratti di un file o di una cartella, poiché le cartelle mostrano un conteggio totale, mentre i file no. Per ovviare a questo, possiamo chiedere il personaggio r
. Questo dovrebbe essere in ~ tutti i file / cartelle (quasi tutti dovrebbero avere almeno un permesso di lettura), ma non nella riga dei totali.
Poiché la linea che vogliamo ottenere diventa la prima linea, possiamo usare head -n 1
per ottenere la prima linea (in alternativa, se preferisci sed, sed -n 1p
potresti usare).
Quindi, ad esempio con una directory:
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 .
e con un 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
Modifica 3: vedi la risposta di Tyilo di seguito per un modo migliore rispetto al grepping per r
:)
ls -Ol fooDir/ | grep hidden
) per visualizzare solo file / cartelle nascosti. Questo mostrerà comunque tutti i file, ma se lo installi attraverso un po 'di magia sed / awk (qualcun altro dovrà aiutare qui, temo) dovresti essere in grado di ottenere solo un elenco di file.
-a
opzione a ls. Per ottenere la linea di cui hai bisogno dall'output, puoi usare sed. Ad esempio: ls -aOl foo | sed -n 2p
. Questo visualizzerà una riga di output. Se contiene la parola "nascosto", allora foo è nascosto. In caso contrario, foo non è nascosto. :)
ls -Old dirname/
mostra le proprietà della directory stessa, non il suo contenuto.
Ho trovato la soluzione qui: Come posso fare per mostrare solo informazioni sulla directory specificata, non informazioni sui suoi sotto-file o contenuti della cartella?
Che fondamentalmente è ls -ldO foo
e quindi basta aggiungere | awk '{ print $5 }'
per farlo visualizzare le informazioni.
stat
.
Come riferito da @Tyilo , @Sorpigal suggerisce di provare stat
, che codifica "flag utente" con %Xf
(ha codificato X f lag utente ), ed è molto più sicuro per l'analisi della macchina.
$ stat -f "%Xf" ~/Library
8000
I valori esadecimali per le bandiere degli utenti vivono qui: grep UF /usr/include/sys/stat.h
. A partire da 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 */