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?
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
ls -d .!(|.)
Fait exactement ce que cherche OP.
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.
ls -ad .*
travaille pour moi à Bash.
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.
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
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.
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 ".[!.]*"
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 "^\."
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 ls
pour 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
.
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
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. SiGLOBIGNORE
est défini, chaque nom de fichier correspondant qui correspond également à l'un des modèles deGLOBIGNORE
est supprimé de la liste des correspondances. Si l'optionnocaseglob
est définie, la correspondance avec les modèles deGLOBIGNORE
est effectuée sans tenir compte de la casse. Les noms de fichiers.
et..
sont toujours ignorés lorsqueGLOBIGNORE
est défini et non null. Toutefois, définirGLOBIGNORE
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 .*
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:~$