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 les fichiers cachés, mais il me suffit d’énumérer les fichiers cachés.
Quelle commande devrais-je utiliser?
command-line
ls
nux
la source
la source
ls -ld .*
ouls -ald .*
va travaillerRéponses:
La commande :
Ne listera que les fichiers cachés.
Explique :
la source
.
et..
du match. Cependant, cela exclura également (parfaitement légal) les noms de fichiers cachés à un seul caractère tels que.a
,.1
etc. Peut-être un glob plus étendu serait.!(|.)
-il un point littéral suivi de quoi que ce soit sauf rien ou un autre point (un seul), c.-à-dls -d .!(|.)
Fait exactement ce que cherche OP.
la source
!(pattern-list)
,pattern-list
est une liste d’un ou de plusieurs modèles séparés par un|
, mais il m’embrouille de penser que vous n’avez pas de modèle à gauche de|
. Pourriez-vous m'expliquer cette syntaxe?.
ne pas suivi de (rien ou.
), à l'exclusion de.
lui-même et..
.Si vous voulez juste les fichiers dans votre répertoire courant (pas de récursion), vous pouvez le faire
Cela affichera les noms de tous les fichiers dont le nom commence par un
.
et est suivi d'un ou de plusieurs caractères autres que des points. Notez que cela échouera pour les fichiers dont le nom commence par des points consécutifs, ainsi, par exemple....foo
, ne sera pas affiché.Vous pouvez aussi utiliser
find
:Le
-mindepth
garantit que nous ne correspondons pas.
et les-prune
moyens quifind
ne descendront pas dans les sous-répertoires.la source
travaille pour moi à Bash.
la source
.
et..
à BashL' utilisation
find
etawk
,Explication:
find . -type f
-> Liste tous les fichiers du répertoire en cours avec son chemin comme,awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
as séparateur de champs, awk vérifie si le dernier champ est marqué d’un point ou non. Si elle commence par un point, elle affiche le dernier champ de la ligne correspondante.la source
find -type f
. Vous n'avez pas besoin de définir explicitement le chemin de recherche ou-name "*"
.find
est généralement une meilleure option pour les recherches compliquées que l’utilisation de la suppression de nom.ou
find .
recherche dans 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 '*~'
rechercher des noms de fichiers qui se terminent par un tilde (généralement, il s'agit de fichiers de sauvegarde provenant de programmes d'édition de texte)Toutefois, cela et toutes les autres réponses manquent des fichiers qui sont dans le
.hidden
fichier du répertoire en cours. Si vous écrivez un script, ces lignes liront le.hidden
fichier et afficheront les noms de fichiers existants.la source
.hidden
fichier? Pourquoi y aurait-il un fichier appelé.hidden
contenant les noms de fichier? Quoi qu’il en soit, s’il ya lieu, pourquoi feriez-vous quelque chose de complexe alors que tout ce dont vous auriez besoincat .hidden
? Votrefind
commande est correcte (ish) mais la-name '*~'
est sans importance. Les fichiers qui se terminent par des tildes sont des fichiers de sauvegarde, mais ne sont en aucun cas cachés..hidden
fichier est destiné aux fichiers et dossiers que vous souhaitez masquer lorsque vous ne pouvez pas modifier le nom du fichier / dossier pour qu'il commence par un point. Quant aux fichiers qui se terminent par des tildes, cela dépend du système.ls -B
ignorera ces fichiers, comme le feront la plupart des explorateurs de fichiers GUI.cat .hidden
peut montrer des fichiers qui n'existent plus si ces fichiers ont été supprimés ou déplacés depuis leur ajout au.hidden
fichier.Je pense que vous pouvez le faire avec la commande suivante.
ls -a
La commande que vous avez entrée affiche tous les fichiers et répertoires du répertoire de travail en cours.grep "^\."
La commande que j’ai ajoutée, qui filtre la sortie en affiche 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 fichiers peuvent avoir plus d'une ligne
"\n"
, les exemples ci-dessus pourraient être incorrects.Je suggère donc de suivre la commande pour résoudre ce problème.
la source
ls
devriez jamais analyser le résultat de .Quoi d’autre que vous auriez pu faire,
is ls .?*
ouls .!(|)
qui vous montrera tout ce qui se trouve dans le répertoire en cours, les fichiers / répertoires cachés en haut et les autres fichiers / répertoires en dessouspar exemple: depuis mon terminal
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.
Désolé, je ne peux pas commenter. pour expliquer la différence ici entre
ls .?*
et @ réponse cioby23ls -d .[!.]* .??*
Et pourquoi il est en fait l' impression de fichiers cachés est deux fois parce que littéralement vous demandez deux fois.??*
,.?*
,.[!.]*
ils sont la même chose, afin d' ajouter l' un d'eux avec différents caractères de commande affiche deux fois.la source
Vous pouvez aussi utiliser:
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
la source
vous pouvez utiliser la commande
Cela présente l’avantage de permettre une liste multi-colonnes, contrairement à l’approche basée sur grep dans les
ls -a | grep "^\."
solutions.la source
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:
Explication
Cela permet de lister tous les fichiers (et répertoires) deux fois,
mais ne montrant qu'une fois les fichiers cachés
-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 à
ls
nouveau pour répertorier tous les fichiers avec les options personnalisées de l'utilisateur et sans lister 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
carecho -e
scindera le nom du fichier en deux lignes. Cela ne fonctionnera pas non plus comme prévu s'il y a 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
tels qu'ils sont imprimés tels quels.foo?.txt
et seraient éliminés paruniq -u
la source
.
du premier caractère...
, mais je me demande si cela fonctionne bien avec les noms de fichiers contenant des caractères spéciaux.echo -e
interprétables. Aussi:ls
ne modifiera pas les noms de fichiers de sorte que deux noms de fichiers différents soient affichés de la même manière (par exemple, certaines versionsls
utiliseront?
des caractères spéciaux, ainsi.foo\tbar
(\t
=> tab) et.foo\nbar
(\n
=> nouvelle ligne) s'afficheront tous les deux commefoo?bar
).Alternativement, vous pouvez également utiliser
echo .*
par exemple
Si vous préférez le format de liste longue, convertissez simplement l'espace blanc en une nouvelle ligne.
la source
Avec bash, définir la
GLOBIGNORE
variable spéciale est une valeur non vide suffit à la faire ignorer.
et..
à développer des globs. De la documentation Bash :Si nous le configurons à
.:..
, les deux.
et..
seront ignorés. Ce comportement étant également défini sur une valeur non nulle, nous pouvons également le définir sur.
Alors:
la source