Question Comment afficher uniquement les fichiers cachés dans Terminal?


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?


107
2018-05-19 00:10


origine


Un simple ls -ld .* ou ls -ald .* marchera - John Strood


Réponses:


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 

134
2018-05-19 00:10



Vous n'avez pas besoin des deux points d'interrogation, le * le couvre (? Ne correspond à aucun caractère, * correspond à n'importe quel nombre). - psusi
@psusi, je pense que l'intention est d'exclure . et .. du match. Cependant, il exclura également les noms de fichiers cachés à caractère unique (parfaitement légaux) tels que .a, .1 etc. Peut-être un glob mieux étendu serait .!(|.) c'est-à-dire un point littéral suivi de tout sauf de rien ou d'un autre point (unique), c'est-à-dire ls -d .!(|.) - steeldriver
@steeldriver, soigné, le ?? la version exclut "." et "..". Cela semble être le résultat d'une bizarrerie intéressante: non? ni * ne correspondra à un point, mais le? doit correspondre quelque chose sinon le nom est ignoré. - psusi
Pour identifier les répertoires et les fichiers, ajoutez l'option F, c'est-à-dire ls -ldF. - RCF
Cela fonctionne quasiment, sauf qu'il répertorie également le dossier caché comme .vim, que je considère pas un fichier ici. Je le modifie un peu comme ls -ldp. grep -v / Ceci liste uniquement les fichiers cachés non cachés - Fred Yang


ls -d .!(|.)

Fait exactement ce que recherche OP.


28
2018-05-19 04:52



Comment ça marche? - SarcasticSully
répertoire de liste n'importe quoi avec un. et ne pas énumérer quoi que ce soit sans un est ce que cela traduit à peu près. - patrick


Si vous voulez juste 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 montré.

Vous pouvez aussi utiliser find:

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

le -mindepth s'assure que nous ne correspondons pas . et le -prune signifie que find ne descendra pas dans les sous-répertoires.


13
2018-05-19 02:57





ls -ad .*

travaille pour moi à Bash.


11
2018-05-19 04:55



Montre . et .. à Bash - Penghe Geng


En utilisant find et awk,

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

Explication:

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

./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 affiche le dernier champ de la ligne correspondante.


4
2018-05-19 02:46



Vous pourriez juste utiliser find -type f. Vous n'avez pas besoin de définir explicitement le chemin de recherche ou -name "*". - terdon♦


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 '.*' trouver des noms de fichiers commençant par un point

-o ou

-name '*~' trouver des noms de fichiers se terminant 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 des fichiers qui se trouvent dans le répertoire actuel. .hidden fichier. Si vous écrivez un script, alors ces lignes liront le .hidden fichier et afficher les noms de fichiers de ceux qui existent.

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
2018-05-19 21:24



Quelle est la .hidden fichier? Pourquoi y aurait-il jamais un fichier appelé .hidden qui contient les noms de fichiers? En tout cas, s'il y en a un, pourquoi feriez-vous quelque chose de complexe alors que tout ce dont vous auriez besoin serait cat .hidden? Votre find la commande est correcte (ish) mais la -name '*~' n'est pas pertinent. Les fichiers qui se terminent par tildes sont des fichiers de sauvegarde mais ne sont en aucun cas cachés. - terdon♦
@terdon le .hidden fichier est pour les fichiers et dossiers que vous souhaitez masquer lorsque vous ne pouvez pas changer le nom du fichier / dossier pour commencer par un point. En ce qui concerne les fichiers se terminant par tildes, cela dépend du système. ls -B ignorera ces fichiers, comme le feront la plupart des explorateurs de fichiers GUI. - Mark H
cat .hidden peut afficher des fichiers qui n'existent plus si ces fichiers ont été supprimés ou déplacés depuis leur ajout au .hidden fichier. - Mark H
Cela fonctionne bien. - Penghe Geng


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é, qui filtre la sortie à n’affiche que les fichiers cachés (son nom commence par ".").

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

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

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

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

2
2018-05-19 02:00



Vous devriez ne jamais analyser la sortie de ls. - Radu Rădeanu
@ RaduRădeanu J'ai vu votre commentaire, c'est tellement bon. J'ai édité ma réponse à nouveau. Merci à votre commentaire. - xiaodongjie


Qu'est-ce que tu aurais pu faire d'autre, is ls .?* Ou ls .!(|) cela vous montrera tout dans les fichiers / dirs cachés actuels du répertoire et les autres fichiers / répertoires ci-dessous

par exemple: de 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 juste en 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. pour expliquer la différence entre ls .?* et @ cioby23 répondre ls -d .[!.]* .??* Et pourquoi il imprime deux fois des fichiers cachés parce que vous demandez littéralement deux fois .??*, .?*, .[!.]* ils sont la même chose, par conséquent, si vous ajoutez des caractères de commande différents, vous imprimerez deux fois.


2
2018-03-19 05:47





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
2018-05-19 05:05



Avec cela, je reçois tous les fichiers cachés deux fois. - TuKsn