Respuestas:
El comando :
ls -ld .?*
Solo enumerará 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
.
y ..
del partido. Sin embargo, también excluirá nombres de archivo ocultos de un solo carácter (perfectamente legales) como .a
, .1
etc. Quizás un globo mejor extendido sería, por .!(|.)
ejemplo, un punto literal seguido de cualquier cosa excepto nada u otro punto (único), es decirls -d .!(|.)
ls -d .!(|.)
Hace exactamente lo que OP está buscando.
!(pattern-list)
, pattern-list
hay una lista de uno o más patrones separados por a |
, pero me resulta confuso que no tenga ningún patrón a la izquierda |
. ¿Podría explicarme esa sintaxis?
.
no es seguido por (nada o .
), excluyéndose .
y ..
.
Si solo desea los archivos en su directorio actual (sin recursividad), puede hacer
echo .[^.]*
Esto imprimirá los nombres de todos los archivos cuyo nombre comience con ay .
siga uno o más caracteres que no sean puntos. Tenga en cuenta que esto fallará 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 '.*'
Esto -mindepth
asegura que no coincidamos .
y los -prune
medios que find
no descenderán a subdirectorios.
Usando find
y awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Explicación:
find . -type f
-> Lista 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 comprueba 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 -type f
. No necesita establecer explícitamente la ruta de búsqueda o -name "*"
.
find
Por lo general, es una mejor opción para búsquedas complicadas que usar el reconocimiento de nombres.
find . -mindepth 1 -maxdepth 1 -name '.*'
o
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find .
busca en el directorio actual
-mindepth 1
excluye. y .. de la lista
-maxdepth 1
limita la búsqueda al directorio actual
-name '.*'
buscar nombres de archivo que comienzan con un punto
-o
o
-name '*~'
buscar nombres de archivo 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 pierden archivos que están en el .hidden
archivo del directorio actual . Si está escribiendo una secuencia de comandos, estas líneas leerán el .hidden
archivo y mostrarán los nombres de los existentes.
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
archivo? ¿Por qué habría un archivo llamado .hidden
que contiene los nombres de archivo? De todos modos, si hay uno, ¿por qué harías algo tan complejo cuando todo lo que necesitarías sería cat .hidden
? Su find
comando es correcto (ish) pero -name '*~'
es irrelevante. Los archivos que terminan en tildes son archivos de respaldo pero no están ocultos de ninguna manera.
.hidden
archivo es para archivos y carpetas que desea ocultar cuando no puede cambiar el nombre del archivo / carpeta para comenzar con un punto. En cuanto a los archivos que terminan en tildes, depende del sistema. ls -B
ignorará dichos archivos, al igual que la mayoría de los exploradores de archivos GUI.
cat .hidden
puede mostrar archivos que ya no existen si esos archivos se eliminaron o movieron desde que se agregaron al .hidden
archivo.
Creo que puedes hacerlo con el siguiente comando.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
comando que ingresó, que muestra todos los archivos y directorios en el directorio de trabajo actual.
grep "^\."
comando que agregué, que filtra la salida para mostrar solo archivos ocultos (su nombre comienza con "."
).
grep -v "^\.$" | grep -v "^\..$"
comando que agregué, que filtra la salida para excluir., .. (Son el directorio actual y principal).
Si algunos nombres de archivo pueden tener más de una línea "\n"
, el ejemplo anterior podría ser incorrecto.
Entonces sugiero seguir el comando para resolver el problema.
find -maxdepth 1 -name ".[!.]*"
ls
.
Qué más podría haber hecho, is ls .?*
o ls .!(|)
eso le mostrará todo en el directorio actual archivos / directorios ocultos en la parte superior y otros archivos / directorios a continuación
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 observe en los resultados anteriores, le muestra cada archivo / directorio con su subdirección 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 entre aquí ls .?*
y la respuesta @ cioby23 ls -d .[!.]* .??*
y por qué es en realidad la impresión de archivos ocultos en dos ocasiones se debe a que, literalmente, le está pidiendo dos veces .??*
, .?*
, .[!.]*
que son la misma cosa, por lo que la adición de cualquiera de ellos con diferentes personajes comando imprimirá dos veces.
Todas las respuestas hasta ahora se basan en el hecho de que los archivos (o directorios) cuyos nombres comienzan con un punto están "ocultos". Se me ocurrió otra solución, que podría no ser tan eficiente, pero esta solución no asume nada sobre los nombres de los archivos ocultos y, por lo tanto, evita la inclusión ..
en el resultado (como lo hace la respuesta actualmente aceptada).
El comando completo es:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Explicación
Lo que esto hace es enumerar todos los archivos (y directorios) dos veces,
echo -e "$(\ls)\n$(\ls -A)"
pero solo muestra archivos ocultos una vez -A
.
Luego se ordena la lista | sort
que hace que los archivos regulares (no ocultos) aparezcan dos veces y uno al lado del otro.
Luego, elimine todas las líneas que aparecen más de una vez | uniq -u
, dejando solo líneas únicas.
Finalmente, use ls
nuevamente para enumerar todos los archivos con las opciones personalizadas del usuario y sin enumerar el contenido de los directorios en la lista -d
.
EDITAR (Limitaciones):
Como señaló muru, esta solución no funcionará correctamente si hay archivos con nombres como escaped\ncharacter.txt
porque echo -e
dividirá el nombre del archivo en dos líneas. Tampoco funcionará como se espera si hay dos archivos ocultos con casi el mismo nombre, excepto por un carácter especial, como .foo[tab].txt
y .foo[new-line].txt
ya que ambos se imprimen .foo?.txt
y serían eliminados poruniq -u
.
el primer personaje.
..
, pero me pregunto qué tan bien funciona con nombres de archivo que contienen caracteres especiales.
echo -e
interpretarán. Además: ls
no alterará los nombres de archivo para que dos nombres de archivo diferentes se muestren de la misma manera (por ejemplo, en algunas versiones ls
se usarán ?
caracteres especiales, por lo que .foo\tbar
( \t
=> tabulación) y .foo\nbar
( \n
=> nueva línea) aparecerán como foo?bar
).
Alternativamente, también puedes usar echo .*
p.ej
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
Si lo prefiere en formato de lista larga, simplemente convierta el espacio en blanco en una nueva línea.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
Con bash, establecer la GLOBIGNORE
variable especial es que un valor no vacío es suficiente para ignorarlo .
y ..
al expandir los globos. De los documentos de Bash :
La
GLOBIGNORE
variable de shell puede usarse para restringir el conjunto de nombres de archivo que coinciden con un patrón. SiGLOBIGNORE
está configurado, cada nombre de archivo coincidente que también coincida con uno de los patronesGLOBIGNORE
se eliminará de la lista de coincidencias. Sinocaseglob
se establece la opción, la comparación con los patronesGLOBIGNORE
se realiza sin tener en cuenta el caso. Los nombres de archivo.
y..
siempre se ignoran cuandoGLOBIGNORE
se establece y no es nulo. Sin embargo, establecerGLOBIGNORE
un valor no nulo tiene el efecto de habilitar la opción de shell dotglob, por lo que todos los demás nombres de archivos que comienzan con‘.
'coincidirán.
Si lo ponemos al .:..
tanto .
y ..
se ignorará. Dado que establecerlo en algo que no sea nulo también obtendrá este comportamiento, también podríamos configurarlo en solo.
Entonces:
GLOBIGNORE=.
ls -d .*
ls -ld .*
ols -ald .*
funcionará