web-dev-qa-db-fra.com

Comment afficher uniquement les fichiers cachés dans Terminal?

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

La commande ls -a répertorie tous les fichiers, y compris ceux qui sont cachés, mais il me suffit d’énumérer les fichiers cachés.

Quelle commande devrais-je utiliser?

141
nux

La commande :

ls -ld .?* 

Ne listera que les fichiers cachés.

Explique :

 -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 
171
nux
ls -d .!(|.)

Fait exactement ce que cherche OP.

30
patrick

Si vous voulez juste les fichiers dans votre répertoire courant (pas de récursion), vous pouvez le faire

echo .[^.]*

Cela affichera les noms de tous les fichiers dont le nom commence par . et est suivi d'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 '.*'

Le -mindepth garantit que nous ne correspondons pas à . et le -Prune signifie que find ne descendra pas dans les sous-répertoires.

15
terdon
ls -ad .*

travaille pour moi à Bash.

13
Mark

Utiliser find et awk,

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

Explication:

find . -type f -> Liste tous les fichiers du répertoire en cours avec son chemin comme,

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

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

/ as separator field awk recherche le dernier champ avec un point ou non. Si elle commence par un point, elle affiche le dernier champ de la ligne correspondante.

4
Avinash Raj

find est généralement une meilleure option pour les recherches complexes que l’utilisation de la suppression de nom.

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

ou

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

find . cherche le répertoire courant

-mindepth 1 exclut. et .. de la liste

-maxdepth 1 limite la recherche au répertoire actuel

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

-o ou

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

Toutefois, cette réponse et toutes les autres réponses manquent des fichiers figurant dans le fichier .hidden du répertoire en cours. Si vous écrivez un script, ces lignes liront le fichier .hidden et afficheront 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
3
Mark H

Quoi d’autres que vous auriez pu faire, is ls .?* Ou ls .!(|) qui vous montrera tout ce qui se trouve dans le répertoire courant des fichiers/répertoires cachés en haut et des 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][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

Désolé, je ne peux pas commenter. expliquer la différence ici entre ls .?* et @ cioby23 answer ls -d .[!.]* .??* Et pourquoi il imprime réellement deux fois des fichiers cachés, c'est parce que vous demandez littéralement deux fois .??*, .?*, .[!.]* imprimera deux fois.

2
amrx

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 montre tous les fichiers et répertoires du répertoire de travail en cours.

La commande grep "^\." 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., .. (Ce sont le répertoire courant et parent).

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

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

find -maxdepth 1 -name ".[!.]*"
2
xiaodongjie

vous pouvez utiliser la commande

ls -Ad .??*

Cela présente l’avantage de permettre une liste multi-colonnes, contrairement à l’approche basée sur grep dans les solutions ls -a | grep "^\."

1
Maythux

Jusqu'à présent, toutes les réponses reposent sur le fait que les fichiers (ou répertoires) dont les noms commencent par un point sont "cachés". Je suis venu avec une autre solution, qui pourrait ne pas être aussi efficace, mais cette solution ne suppose rien sur les noms des fichiers cachés, et évite donc de lister .. dans le résultat (comme le fait la réponse actuellement acceptée).

La commande complète est:

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

Explication

Cela permet de lister deux fois tous les fichiers (et répertoires),

echo -e "$(\ls)\n$(\ls -A)"

mais ne montrant que les fichiers cachés une fois -A.

Ensuite, la liste est triée | sort, ce qui fait apparaître les fichiers normaux (non cachés) deux fois et les uns à côté des autres.

Ensuite, supprimez toutes les lignes qui apparaissent plusieurs fois | uniq -u, ne laissant que des lignes uniques.

Enfin, utilisez à nouveau lspour répertorier tous les fichiers avec les options personnalisées de l'utilisateur et sans répertorier le contenu des répertoires de la liste -d.

EDIT (Limitations):

Comme le souligne muru, cette solution ne fonctionnera pas correctement s'il existe des fichiers portant des noms tels que escaped\ncharacter.txt car echo -e divisera le nom du fichier en deux lignes. Cela ne fonctionnera pas non plus comme prévu s'il existe deux fichiers cachés portant presque le même nom, à l'exception d'un caractère spécial, tel que .foo[tab].txt et .foo[new-line].txt, car ces deux fichiers sont imprimés sous le nom .foo?.txt et seraient éliminés par uniq -u.

1
alejandro

Vous pouvez aussi utiliser:

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

Cela vous permettra d'afficher des fichiers cachés normaux et des fichiers cachés qui commencent par 2 ou 3 points, par exemple: ..hidden_file

1
cioby23

Avec bash, définir la variable spéciale GLOBIGNORE est une valeur non vide suffit à ignorer les codes . et .. lors du développement de globs. De les documents Bash :

La variable shell GLOBIGNORE peut être utilisée pour restreindre l’ensemble des noms de fichiers correspondant à un modèle. Si GLOBIGNORE est défini, chaque nom de fichier correspondant qui correspond également à l'un des modèles de GLOBIGNORE est supprimé de la liste des correspondances. Si l'option nocaseglob est définie, la correspondance avec les modèles de GLOBIGNORE est effectuée sans tenir compte de la casse. Les noms de fichiers . et .. sont toujours ignorés lorsque GLOBIGNORE est défini et non null. Toutefois, définir GLOBIGNORE sur une valeur non nulle a pour effet d'activer l'option dotglob Shell. Tous les autres noms de fichiers commençant par ‘. ’seront donc identiques.

Si nous le configurons sur .:.., les deux . et .. seront ignorés. Etant donné que le comportement sur une valeur non-nulle entraîne également ce comportement, nous pourrions également le définir sur .

Alors:

GLOBIGNORE=.
ls -d .*
0
muru

Vous pouvez également utiliser echo .*

par exemple.

user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$

Si vous préférez le format de liste longue, convertissez simplement les espaces en une nouvelle ligne.

user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$ 
0
Sabrina