Risposte:
Il comando :
ls -ld .?*
Elencherà solo i file nascosti.
Spiega:
-l use a long listing format
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
.?* will only state hidden files
.
e ..
dalla partita. Tuttavia escluderà anche i nomi di file nascosti a carattere singolo (perfettamente legali) come .a
, .1
e così via. Forse un globo più esteso sarebbe .!(|.)
cioè punto letterale seguito da qualsiasi cosa tranne niente o un altro (singolo) punto cioèls -d .!(|.)
ls -d .!(|.)
Fa esattamente quello che OP sta cercando.
!(pattern-list)
, pattern-list
è un elenco di uno o più schemi separati da un |
, ma è confuso per me che non hai alcun modello a sinistra di |
. Potresti spiegarmi questa sintassi, per favore?
.
non seguito da (niente o .
), escludendo .
se stesso e ..
.
Se vuoi solo i file nella tua directory corrente (nessuna ricorsione), puoi farlo
echo .[^.]*
Ciò stamperà i nomi di tutti i file il cui nome inizia con una .
ed è seguito da uno o più caratteri non punti. Nota che ciò non funzionerà per i file il cui nome inizia con punti consecutivi, quindi ad esempio ....foo
non verrà mostrato.
Puoi anche usare find
:
find -mindepth 1 -prune -name '.*'
Le -mindepth
assicura che non corrispondono .
ed i -prune
mezzi che find
non scende in sottodirectory.
Utilizzando find
e awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Spiegazione:
find . -type f
-> Elenca tutti i file nella directory corrente insieme al suo percorso come,
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
come separatore di campo awk controlla l'ultimo campo che fissa con un punto o no. Se inizia con un punto, stampa l'ultimo campo della riga corrispondente.
find -type f
. Non è necessario impostare esplicitamente il percorso di ricerca o -name "*"
.
find
di solito è un'opzione migliore per ricerche complicate rispetto all'uso del nome globbing.
find . -mindepth 1 -maxdepth 1 -name '.*'
o
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find .
cerca la directory corrente
-mindepth 1
esclude. e .. dalla lista
-maxdepth 1
limita la ricerca alla directory corrente
-name '.*'
trova i nomi dei file che iniziano con un punto
-o
o
-name '*~'
trova nomi di file che terminano con una tilde (in genere si tratta di file di backup da programmi di modifica del testo)
Tuttavia, questa e tutte le altre risposte mancano i file che si trovano nel .hidden
file della directory corrente . Se stai scrivendo uno script, queste righe leggeranno il .hidden
file e visualizzeranno i nomi dei file di quelli esistenti.
if [[ -f .hidden]] # if '.hidden' exists and is a file
then
while read filename # read file name from line
do
if [[ -e "$filename" ]] # if the read file name exists
then
echo "$filename" # print it
fi
done < .hidden # read from .hidden file
fi
.hidden
file? Perché dovrebbe mai esserci un file chiamato .hidden
che contiene i nomi dei file? Ad ogni modo, se ce n'è uno, perché dovresti fare qualcosa di così complesso quando tutto ciò di cui hai bisogno sarebbe cat .hidden
? Il tuo find
comando è corretto (ish) ma -name '*~'
è irrilevante. I file che finiscono in tilde sono file di backup ma non nascosti in alcun modo.
.hidden
file è per file e cartelle che si desidera nascondere quando non è possibile modificare il nome del file / cartella per iniziare con un punto. Per quanto riguarda i file che finiscono in tilde, dipende dal sistema. ls -B
ignorerà tali file, così come la maggior parte dei file explorer della GUI.
cat .hidden
potrebbe mostrare file che non esistono più se tali file sono stati eliminati o spostati da quando sono stati aggiunti al .hidden
file.
Penso che puoi farlo con il seguente comando.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
comando inserito, che mostra tutti i file e le directory nella directory di lavoro corrente.
grep "^\."
comando che ho aggiunto, che filtra l'output per mostrare solo i file nascosti (il suo nome inizia con "."
).
grep -v "^\.$" | grep -v "^\..$"
comando che ho aggiunto, che filtra l'output per escludere., .. (Sono directory corrente e parent).
Se alcuni nomi di file possono avere più di una riga con "\n"
, l'esempio sopra potrebbe essere errato.
Quindi suggerisco il seguente comando per risolverlo.
find -maxdepth 1 -name ".[!.]*"
ls
.
Cos'altro avresti potuto fare, is ls .?*
o ls .!(|)
che ti mostrerà tutto nella directory corrente, file nascosti / directory in alto e altri file / directory in basso
ad es .: dal mio terminale
$ ls .?*
.bash_history .dmrc .macromedia .weather
.bash_logout .gksu.lock .profile .wgetrc
.bash_profile .bashrc.save .ICEauthority .toprc .Xauthority
.bashrc .lastdir .viminfo .xsession-errors
.bashrc~ .dircolors .lynxrc .vimrc .xsession-errors.old
..:
Baron
.adobe:
Flash_Player
.aptitude:
cache config
.cache:
compizconfig-1 rhythmbox
dconf shotwell
Ora noti i risultati sopra, ti mostra tutti i file / dir con il suo sottodir ed eventuali file nascosti proprio sotto.
[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases .bashrc1 .bashrc1~
..:
askapache-bash-profile.txt examples.desktop Public top-1m.csv
backups Firefox_wallpaper.png PycharmProjects top-1m.csv.zip
Desktop java_error_in_PYCHARM_17581.log Shotwell Import Log.txt topsites.txt
Documents Music Templates Videos
Downloads Pictures texput.log vmware
Spiacente, non posso commentare. di spiegare la differenza tra il qui ls .?*
e @ risposta cioby23 ls -d .[!.]* .??*
e perché è in realtà la stampa di file nascosti per due volte è perché letteralmente si sta chiedendo due volte .??*
, .?*
, .[!.]*
sono la stessa cosa, quindi l'aggiunta di uno di essi, con diversi caratteri di comando verrà stampata due volte.
Tutte le risposte finora si basano sul fatto che i file (o directory) i cui nomi iniziano con un punto sono "nascosti". Ho trovato un'altra soluzione, che potrebbe non essere altrettanto efficiente, ma questa soluzione non assume nulla riguardo ai nomi dei file nascosti e quindi evita di elencare ..
il risultato (così come la risposta attualmente accettata).
Il comando completo è:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Spiegazione
Ciò che fa è elencare tutti i file (e le directory) due volte,
echo -e "$(\ls)\n$(\ls -A)"
ma mostra solo una volta i file nascosti -A
.
Quindi viene ordinato l'elenco | sort
che fa apparire i file regolari (non nascosti) due volte e uno accanto all'altro.
Quindi, rimuovi tutte le linee che appaiono più di una volta | uniq -u
, lasciando solo linee uniche.
Infine, utilizza ls
nuovamente per elencare tutti i file con le opzioni personalizzate dell'utente e senza elencare il contenuto delle directory nell'elenco -d
.
EDIT (Limitazioni):
Come ha sottolineato Muru, questa soluzione non funzionerà correttamente se ci sono file con nomi come escaped\ncharacter.txt
perché echo -e
divideranno il nome del file in due righe. Inoltre non funzionerà come previsto se ci sono due file nascosti con quasi lo stesso nome, tranne per un carattere speciale, come .foo[tab].txt
e .foo[new-line].txt
poiché entrambi vengono stampati come .foo?.txt
e sarebbero eliminati dauniq -u
.
come primo personaggio.
..
, ma mi chiedo quanto funzioni bene con nomi di file contenenti caratteri speciali.
echo -e
possano interpretare. Inoltre: ls
non manipolerà i nomi dei file in modo che due nomi di file diversi vengano visualizzati allo stesso modo (ad esempio, in alcune versioni ls
verranno utilizzati ?
per caratteri speciali, quindi .foo\tbar
( \t
=> tab) e .foo\nbar
( \n
=> newline) appariranno entrambi come foo?bar
).
In alternativa, puoi anche usare echo .*
per esempio
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
Se lo preferisci in un lungo elenco, converti semplicemente lo spazio bianco in una nuova riga.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
Con bash, l'impostazione della GLOBIGNORE
variabile speciale è un valore non vuoto è sufficiente per farlo ignorare .
e ..
quando si espandono globs. Dai documenti di Bash :
La
GLOBIGNORE
variabile shell può essere utilizzata per limitare l'insieme di nomi di file che corrispondono a un modello. SeGLOBIGNORE
impostato, ogni nome file corrispondente che corrisponde anche a uno dei motivi inGLOBIGNORE
viene rimosso dall'elenco delle corrispondenze. Se l'nocaseglob
opzione è impostata, la corrispondenza con i motivi inGLOBIGNORE
viene eseguita indipendentemente dal caso. I nomi dei file.
e..
vengono sempre ignorati quandoGLOBIGNORE
è impostato e non null. Tuttavia, l'impostazioneGLOBIGNORE
su un valore non nullo ha l'effetto di abilitare l'opzione shell dotglob, quindi tutti gli altri nomi di file che iniziano con un‘.
'corrisponderanno.
Se lo impostiamo su .:..
, entrambi .
e ..
verranno ignorati. Dato che impostandolo su qualcosa di diverso da null otterrà anche questo comportamento, potremmo anche impostarlo su just.
Così:
GLOBIGNORE=.
ls -d .*
ls -ld .*
ols -ald .*
funzionerà