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, .1e 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 ....foonon verrà mostrato.
Puoi anche usare find:
find -mindepth 1 -prune -name '.*'
Le -mindepthassicura che non corrispondono .ed i -prunemezzi che findnon scende in sottodirectory.
Utilizzando finde 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 1esclude. 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 .hiddenfile della directory corrente . Se stai scrivendo uno script, queste righe leggeranno il .hiddenfile 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
.hiddenfile? Perché dovrebbe mai esserci un file chiamato .hiddenche 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 findcomando è corretto (ish) ma -name '*~'è irrilevante. I file che finiscono in tilde sono file di backup ma non nascosti in alcun modo.
.hiddenfile è 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 -Bignorerà tali file, così come la maggior parte dei file explorer della GUI.
cat .hiddenpotrebbe mostrare file che non esistono più se tali file sono stati eliminati o spostati da quando sono stati aggiunti al .hiddenfile.
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 | sortche 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 lsnuovamente 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.txtperché echo -edivideranno 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].txte .foo[new-line].txtpoiché entrambi vengono stampati come .foo?.txte sarebbero eliminati dauniq -u
.come primo personaggio.
.., ma mi chiedo quanto funzioni bene con nomi di file contenenti caratteri speciali.
echo -epossano interpretare. Inoltre: lsnon manipolerà i nomi dei file in modo che due nomi di file diversi vengano visualizzati allo stesso modo (ad esempio, in alcune versioni lsverranno 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 GLOBIGNOREvariabile speciale è un valore non vuoto è sufficiente per farlo ignorare .e ..quando si espandono globs. Dai documenti di Bash :
La
GLOBIGNOREvariabile shell può essere utilizzata per limitare l'insieme di nomi di file che corrispondono a un modello. SeGLOBIGNOREimpostato, ogni nome file corrispondente che corrisponde anche a uno dei motivi inGLOBIGNOREviene rimosso dall'elenco delle corrispondenze. Se l'nocaseglobopzione è impostata, la corrispondenza con i motivi inGLOBIGNOREviene eseguita indipendentemente dal caso. I nomi dei file.e..vengono sempre ignorati quandoGLOBIGNOREè impostato e non null. Tuttavia, l'impostazioneGLOBIGNOREsu 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à