Tengo un directorio que contiene miles de archivos, algunos de ellos están ocultos.
El comando ls -a
lista todos los archivos, incluidos los ocultos, pero solo necesito enumerar los archivos ocultos.
¿Qué comando debería usar?
Tengo un directorio que contiene miles de archivos, algunos de ellos están ocultos.
El comando ls -a
lista todos los archivos, incluidos los ocultos, pero solo necesito enumerar los archivos ocultos.
¿Qué comando debería usar?
El comando:
ls -ld .?*
Solo mostrará los archivos ocultos.
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 .!(|.)
Hace exactamente lo que OP está buscando.
Si solo quiere los archivos en su directorio actual (sin recurrencia), podría hacer
echo .[^.]*
Eso imprimirá los nombres de todos los archivos cuyo nombre comienza con un .
y es seguido por uno o más caracteres que no son puntos. Tenga en cuenta que esto no funcionará para los archivos cuyo nombre comience con puntos consecutivos, por lo que, por ejemplo, ....foo
no se mostrará.
También puedes usar find
:
find -mindepth 1 -prune -name '.*'
El -mindepth
asegura que no coincide con .
y el -prune
significa que find
no descenderá a los subdirectorios.
ls -ad .*
funciona para mí en Bash.
Usar find
y awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Explicación:
find . -type f
- & gt; Enumere todos los archivos en el directorio actual junto con su ruta, como
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
como separador de campo awk busca el último campo que mira con un punto o no. Si comienza con un punto, imprime el último campo de esa línea correspondiente.
find
suele ser una mejor opción para búsquedas complicadas que usar el nombre globbing.
find . -mindepth 1 -maxdepth 1 -name '.*'
o
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find .
busca el directorio actual
-mindepth 1
excluye. y ... de la lista p>
-maxdepth 1
limita la búsqueda al directorio actual
-name '.*'
encuentra nombres de archivos que comienzan con un punto
-o
o
-name '*~'
encuentra nombres de archivos que terminan con una tilde (generalmente, estos son archivos de respaldo de programas de edición de texto)
Sin embargo, esta y todas las otras respuestas faltan archivos que están en el archivo .hidden
del directorio actual. Si está escribiendo una secuencia de comandos, estas líneas leerán el archivo .hidden
y mostrarán los nombres de los archivos que existen.
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
Creo que puedes hacerlo con el siguiente comando.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
que ingresaste, que muestra todos los archivos y directorios en el directorio de trabajo actual.
grep "^\."
El comando que anexé, que filtra la salida muestra solo los archivos ocultos (su nombre comienza con "."
).
grep -v "^\.$" | grep -v "^\..$"
comando Anexé, que filtra la salida para excluir., .. (Son directorio actual y principal).
Si algunos nombres de archivo pueden tener más de una línea con "\n"
, el ejemplo anterior podría ser incorrecto.
Así que sugiero seguir el comando para resolver el problema.
find -maxdepth 1 -name ".[!.]*"
¿Qué otra cosa podría haber hecho? is ls .?*
O ls .!(|)
que le mostrará todo en los directorios / dirs ocultos del directorio actual en la parte superior y otros archivos / directorios debajo de
por ejemplo: desde mi 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
Ahora fíjate en los resultados anteriores, te muestra cada archivo / directorio con su subdirectorio y cualquier archivo oculto justo debajo.
[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
Lo siento, no puedo comentar para explicar la diferencia aquí entre ls .?*
y @ cioby23 answer ls -d .[!.]* .??*
Y por qué en realidad está imprimiendo dos veces los archivos ocultos es porque literalmente preguntas dos veces .??*
, .?*
, .[!.]*
son lo mismo , por lo que agregar cualquiera de ellos con diferentes caracteres de comando se imprimirá dos veces.
También puede usar:
ls -d .[!.]* .??*
Esto le permitirá visualizar archivos ocultos normales y ocultos que comienzan con 2 o 3 puntos, por ejemplo: ..hidden_file
puedes usar el comando
ls -Ad .??*
Esto tiene la ventaja de permitir el listado de varias columnas, a diferencia del enfoque basado en grep en las soluciones ls -a | grep "^\."
Lea otras preguntas en las etiquetas command-line gnome-terminal ls