¿Cómo buscar todos los archivos que comienzan con el nombre "ABC" en un directorio?


58

Necesito buscar archivos que comiencen con algún nombre en particular. Puede haber múltiples archivos comenzando con un patrón particular y quiero enumerar todos esos archivos presentes en el directorio.

Respuestas:


60

Para completar las respuestas existentes:

ls

La utilidad de lista de directorio predeterminada lsse puede usar en combinación con los comodines del shell. Para buscar todos los archivos con patrón abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Tenga en cuenta que la extensión del archivo también es relevante para los resultados de búsqueda.


tree

En caso de que necesitemos enumerar archivos en un árbol de directorios, también podemos emitir treepara buscar un patrón dado como:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

En este caso, treesí admite comodines.


2
¿Por qué cuando lo hago ls -l B*, muestra el contenido de todos los directorios que comienzan en Blugar de solo los nombres de los directorios coincidentes?
ErikE

@ErikE Porque cuando pides que aparezca lsun directorio, lo abre, es lo mismo que hacer ls -l BirthdayPhotos. Puede suprimir ese comportamiento con ls -d B*.
Azor Ahai

@AzorAhai Pero, ¿por qué se trata B*como una especificación de directorio?
ErikE

@ErikE Debido a que el uso del archivo glob se B*expande para coincidir con todos los directorios que comienzan, por Blo que realmente está pasando lsuna lista de directorios, por lo que los abre todos para usted.
Azor Ahai

1
No responde la pregunta. ls -d ABC*era sobre lo que el autor preguntaba. También los comentarios en el fragmento de código son incorrectos, ls abc*enumera el contenido de los directorios que comienzan con abc.
greatvovan

42

Puede usar el findcomando para buscar archivos con patrón

find . -type f -name "abc*" 

El comando anterior buscará el archivo que comienza con abc en el directorio de trabajo actual.

-name 'abc'enumerará los archivos que coinciden exactamente. Por ejemplo: abc

También puedes usar

 -iname
 -regex 

opción con findcomando para buscar nombre de archivo usando un patrón


7

Hay muchas formas de hacerlo, dependiendo exactamente de lo que quieras hacer con ellos. En general, si solo desea enumerarlos, puede hacerlo en una terminal usando:

find | grep '^\./ABC'

... y reemplazando ABCcon su texto.

Para entender el comando, analicemos un poco:

  • findenumera todos los archivos en el directorio actual y sus subdirectorios; usarlo solo enumerará todo allí. Tenga en cuenta que findgenera cada archivo o directorio que comienza con ./, lo que indica que su ruta es relativa al directorio actual. Ser consciente de esto es importante porque significa que buscaremos resultados que comiencen ./ABCy no solo ABC.

  • El carácter de canalización |redirige la salida de un comando a otro, en este caso la salida de findse redirige a grep. Esto se llama tubería.

  • greptoma la salida y lo filtra utilizando el patrón dado, ^\./ABC.

    • Observe que el patrón se cita con comillas simples ' 'para evitar que el intérprete interprete los caracteres especiales que contiene.
  • Ahora el patrón en sí está escrito en una sintaxis particular llamada expresión regular , o expresión regular para abreviar. Regex es una herramienta de búsqueda extremadamente poderosa si la dominas, y hay sitios como este que te enseñan sobre ello con más profundidad, pero ten en cuenta que grepno es un motor de expresiones regulares completo y no puedes hacer todo con él.

  • Para nuestro propósito:

    • ^en regex coincide con el comienzo de la cadena; esto evita que coincida con el patrón si no aparece al comienzo del nombre del archivo.

    • .en regex también tiene un significado especial: significa "hacer coincidir cualquier carácter aquí". En caso de que quiera usarlo como un punto literal, tendrá que "escapar" usando una barra invertida \antes. (Sí, emparejar cualquier personaje sería inofensivo en nuestro caso, pero lo hice por completo).


1
¿Por qué lo harías find | grepcuando findtiene sus propias capacidades de coincidencia de patrones perfectamente buenas?
Darael

3

puede usar GREP, creo que esta es la solución más simple, probablemente también agregue algunos otros parámetros grep para que la coincidencia sea más precisa

tree | grep ABC

2

Puede buscar un patrón en particular utilizando el administrador de archivos Nautilus y las expresiones regulares.

Para hacerlo, haga clic en Seleccionar elementos que coincidan en el menú de engranaje como se muestra a continuación (también puede presionar Ctrl+ s).

ingrese la descripción de la imagen aquí

Luego, simplemente escriba la expresión regular ABC* y valide.

ingrese la descripción de la imagen aquí

Cada archivo cuyo nombre coincida con su patrón se seleccionará automáticamente.

ingrese la descripción de la imagen aquí

Estoy usando Nautilus 3.6. * De GNOME3 PPA en Ubuntu 12.10 (Quantal).


1

La solución más fácil para mí

ls | grep PATTERN

Aquí puede dar cualquier expresión regular en el PATRÓN.

Por ejemplo, para buscar archivos con "ab" en cualquier lugar dentro de su nombre, escriba

ls | grep ".*ab.*"

Para buscar los archivos que comienzan con "ab", escriba

ls | grep "^ab"

1

Si no conoce el directorio en el ABC*que se encuentran los archivos y tiene millones de archivos, el locatecomando es el método más rápido.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Notas:

  • El comando anterior tarda 1 segundo en ejecutarse en 1 millón de archivos.
  • En comparación, el findcomando que comienza en el /directorio raíz llevará mucho tiempo y generará muchos errores de permiso.
  • Si los archivos se crearon hoy, sudo updatedbprimero debe ejecutarlos .

0

yo suelo

ls | grep abc

o

ls -la | grep abc

Muestra todos los archivos con abc, no solo comienza con abc. Pero, es una manera realmente fácil para mí de hacer esto.


0

Pitón:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

Esta es una coincidencia de patrón glob que está anclada en ambos extremos. Esto coincidirá con todas las apariciones de archivos que comienzan con "ABC", como "ABC", "ABC.txt", "ABC123", pero no "xABC". Desde la línea de comando usando 'ls' en lugar de 'printf' aquí hay una alternativa segura, sin embargo, dependiendo de con quién esté de acuerdo, 'ls' no es seguro para usar en un script. En ese caso, usar 'printf' con coincidencia de patrón global se considera seguro. Si va a usar esto en un script, la salida de 'printf' no contendrá un nuevo carácter de línea hasta el final de la secuencia de salida como tal:

printf "%s" /path/to/files/ABC*  

Devoluciones:

/path/to/files/ABC /path/to/files/ABC123

Si necesita saltos de línea después de cada instancia:

printf "%s\n" /path/to/files/ABC*

Devoluciones:

/path/to/files/ABC 

/path/to/files/ABC123

"/ ruta / a / archivos /" permanece en la salida si lo ingresó de esa manera cuando ejecutó el comando 'printf'. Sin él solo aparece el nombre del archivo:

printf "%s" ABC* 

Devoluciones

ABC ABC123

Suponiendo que ejecuta el comando dentro del directorio en el que existen los archivos.


La echo /path/to/files/ABC* | tr " " "\n"no es una buena idea. Considere si hay un archivo /path/to/files/ABC EFG, hay un espacio en el nombre del archivo. Su trdividirá el nombre del archivo en dos líneas separadas, lo que no es bueno. Peor aún si hay múltiples espacios en el nombre del archivo. En su printf "%s\n" ABC*lugar, le recomiendo que use , lo que debería ayudar con espacios en los nombres de archivo, pero sigue siendo problemático con otros caracteres especiales como\n
Sergiy Kolodyazhnyy

0

Command-t en uno de mis complementos vim favoritos, es un complemento basado en ruby ​​que está por encima de la integración con FZF.

Mediante el uso de Comamnd-T y FZF, puede realizar la búsqueda con un mecanismo "difuso" extremadamente rápido para:

  • Abrir archivos y buffers
  • Saltar a etiquetas y ayuda
  • Ejecutar comandos o búsquedas y comandos anteriores
  • con un número mínimo de pulsaciones de teclas.

Como puedes ver

ingrese la descripción de la imagen aquí

Siempre busco en el historial de comandos abriendo una nueva terminal y presiono:

CTRL+R

Además de buscar en todas las carpetas de forma recursiva escribiendo en cualquier pestaña de terminal:

fzf

Luego comienza tu nombre de archivo

ABC

Además, puedes escribir adentro vim

:CommandT 

Realmente útil especialmente en carpetas grandes.


0

Suponga que estoy en el directorio raíz y solo quiero la lista del directorio etc: escribimos,

find -type d -name "etc"

resultado que obtenemos,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Otro ejemplo,

También podemos escribir:

ls | grep "etc"

obtenemos,

etc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.