Comment afficher uniquement les fichiers cachés dans Terminal?

104

J'ai un répertoire qui contient des milliers de fichiers, dont certains sont cachés.

La commande ls -a liste tous les fichiers, y compris les fichiers cachés, mais je dois juste lister les fichiers cachés.

Quelle commande dois-je utiliser?

    
posée nux 19.05.2014 - 02:10
la source

10 réponses

133

La commande:

ls -ld .?* 

Ne listera que les fichiers cachés.

Expliquez:

 -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 
    
réponse donnée nux 19.05.2014 - 02:10
la source
28
ls -d .!(|.)

Fait exactement ce que recherche OP.

    
réponse donnée patrick 19.05.2014 - 06:52
la source
12

Si vous voulez simplement les fichiers dans votre répertoire actuel (pas de récursivité), vous pouvez le faire

echo .[^.]*

Cela va imprimer les noms de tous les fichiers dont le nom commence par . et est suivi par un ou plusieurs caractères autres que des points. Notez que cela échouera pour les fichiers dont le nom commence par des points consécutifs, par exemple ....foo ne sera pas affiché.

Vous pouvez également utiliser find :

find -mindepth 1 -prune -name '.*'

-mindepth garantit que nous ne correspondons pas à . et que -prune signifie que find ne descendra pas dans des sous-répertoires.

    
réponse donnée terdon 19.05.2014 - 04:57
la source
11
ls -ad .*

travaille pour moi dans Bash.

    
réponse donnée Mark 19.05.2014 - 06:55
la source
4

Utilisation de find et awk ,

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

Explication:

find . -type f - & gt; Répertorie tous les fichiers du répertoire en cours avec son chemin d'accès,

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/ en tant que séparateur de champs awk vérifie si le dernier champ contient un point ou non. S'il commence par un point, il imprime le dernier champ de la ligne correspondante.

    
réponse donnée Avinash Raj 19.05.2014 - 04:46
la source
2

find est généralement une meilleure option pour les recherches compliquées que l'utilisation de la globalisation des noms.

find . -mindepth 1 -maxdepth 1 -name '.*'

ou

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . recherche le répertoire courant

-mindepth 1 exclut. et .. de la liste

-maxdepth 1 limite la recherche au répertoire en cours

-name '.*' trouve des noms de fichiers commençant par un point

-o ou

-name '*~' recherche les noms de fichiers qui se terminent par un tilde (généralement, ce sont des fichiers de sauvegarde de programmes d'édition de texte)

Cependant, ceci et toutes les autres réponses manquent les fichiers qui se trouvent dans le fichier .hidden du répertoire en cours. Si vous écrivez un script, ces lignes lisent le fichier .hidden et affichent les noms de fichiers existants.

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
    
réponse donnée Mark H 19.05.2014 - 23:24
la source
2

Je pense que vous pouvez le faire avec la commande suivante.

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a commande que vous avez entrée, qui affiche tous les fichiers et répertoires dans le répertoire de travail en cours.

grep "^\." commande que j'ai ajoutée, qui filtre la sortie pour afficher uniquement les fichiers cachés (son nom commence par "." ).

grep -v "^\.$" | grep -v "^\..$" commande que j'ai ajoutée, qui filtre la sortie à exclure., .. (il s'agit du répertoire courant et du répertoire parent).

Si certains noms de fichiers peuvent avoir plus d'une ligne avec "\n" , l'exemple ci-dessus peut être incorrect.

Je suggère donc de suivre la commande pour résoudre le problème.

find -maxdepth 1 -name ".[!.]*"
    
réponse donnée xiaodongjie 19.05.2014 - 04:00
la source
2

Qu'est-ce que vous auriez pu faire d'autre, is ls .?* ou ls .!(|) qui vous montrerait tout ce qui se trouve dans les fichiers / dirs cachés actuels du répertoire et les autres fichiers / répertoires ci-dessous

par exemple: depuis mon terminal

$ 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

Maintenant, remarquez dans les résultats ci-dessus, il vous montre chaque fichier / répertoire avec son sous-répertoire et tous les fichiers cachés ci-dessous.

[1:0:248][[email protected]: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

Désolé, je ne peux pas commenter. pour expliquer la différence entre ls .?* et @ cioby23 answer ls -d .[!.]* .??* Et pourquoi il imprime deux fois des fichiers cachés parce que vous demandez littéralement deux fois .??* , .?* , .[!.]* la même chose , l'ajout de l'un d'eux avec des caractères de commande différents sera imprimé deux fois.

    
réponse donnée amrx 19.03.2015 - 06:47
la source
1

Vous pouvez également utiliser:

ls -d .[!.]* .??*

Cela vous permettra d’afficher des fichiers cachés normaux et des fichiers cachés commençant par 2 ou 3 points, par exemple: ..hidden_file

    
réponse donnée cioby23 19.05.2014 - 07:05
la source
1

vous pouvez utiliser la commande

ls -Ad .??*

Cela a l’avantage d’autoriser la création de listes multi-colonnes, contrairement à l’approche basée sur grep dans les solutions ls -a | grep "^\."

    
réponse donnée Maythux 06.05.2015 - 17:46
la source

Lire d'autres questions sur les étiquettes