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
.
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 .!(|.)
ls -d .!(|.)
Fait exactement ce que cherche OP.
!(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
echo .[^.]*
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
:
find -mindepth 1 -prune -name '.*'
Le -mindepth
garantit que nous ne correspondons pas .
et les -prune
moyens qui find
ne descendront pas dans les sous-répertoires.
L' utilisation 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 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.
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.
find . -mindepth 1 -maxdepth 1 -name '.*'
ou
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
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.
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
.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 besoin cat .hidden
? Votre find
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 | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
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.
find -maxdepth 1 -name ".[!.]*"
ls
devriez jamais analyser le résultat de .
Quoi d’autre que vous auriez pu faire, is ls .?*
ou ls .!(|)
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 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. pour expliquer la différence ici entre ls .?*
et @ réponse cioby23 ls -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.
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 tous les fichiers (et répertoires) deux fois,
echo -e "$(\ls)\n$(\ls -A)"
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
car echo -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
.
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 versions ls
utiliseront ?
des caractères spéciaux, ainsi .foo\tbar
( \t
=> tab) et .foo\nbar
( \n
=> nouvelle ligne) s'afficheront tous les deux comme foo?bar
).
Alternativement, 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 l'espace blanc en une nouvelle ligne.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
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 :
La
GLOBIGNORE
variable shell peut être utilisée pour restreindre l’ensemble des noms de fichiers correspondant à un motif. SiGLOBIGNORE
est défini, chaque nom de fichier correspondant qui correspond également à l'un des modèlesGLOBIGNORE
est supprimé de la liste des correspondances. Si l'nocaseglob
option est définie, la correspondance avec les modèlesGLOBIGNORE
est effectuée sans tenir compte de la casse. Les noms de fichiers.
et..
sont toujours ignorés lorsqueGLOBIGNORE
est défini et non nul. Toutefois, la définitionGLOBIGNORE
d'une valeur non nulle a pour effet d'activer l'option shell dotglob. Par conséquent, tous les autres noms de fichiers commençant par un‘.
'seront identiques.
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:
GLOBIGNORE=.
ls -d .*
ls -ld .*
ouls -ald .*
va travailler