Encuentra archivos de forma recursiva con una extensión específica


81

Estoy tratando de encontrar archivos con extensiones específicas. Por ejemplo, quiero encontrar todos los archivos .pdf y .jpg que se llaman Robert

Sé que puedo hacer este comando

$ find . -name '*.h' -o -name '*.cpp'

pero necesito especificar el nombre del archivo en sí además de las extensiones. Solo quiero ver si hay una forma posible de evitar escribir el nombre del archivo una y otra vez. ¡Gracias!


4
Cualquiera que copie este comando, o cualquiera que esté debajo, debería usarlo inameen su lugar, que no distingue entre mayúsculas y minúsculas .
Addison

Buen punto, Addison (de ahí el +1). Sin embargo, parece que el OP quiere archivos llamados 'Robert' con una 'R' mayúscula. Como interpreto la publicación, esto significa que los archivos que contienen 'robert' NO deben ser generados. ' R obert' es lo que está escrito. Sin embargo, hay situaciones en las que alguien querría que encontraran a 'Robert' o 'robert'. Quizás el OP esté en esta situación. Ya sea para usar inameo namedepende de lo que desee encontrar. He estado en situaciones en las que el caso era fundamental.
bballdave025

Respuestas:


100

Mi preferencia:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

2
Funciona bien, pero una pequeña desventaja es que le impide hacer unfind -exec ...
Mark Setchell

¿Qué pasa si quiero encontrar todos los archivos xxx-deployment.yml en todas las carpetas en una ruta específica?
Naim Salameh

Esto no funciona tan bien si tiene jpgo pngcomo parte de un camino más largo.
AutonomousApps

17

Usando findel -regexargumento de ':

find . -regex '.*/Robert\.\(h\|cpp\)$'

O simplemente usando -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)

4
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

El -orepreents una ORcondición y se puede añadir tantos como desee dentro de las llaves. Esto dice que busque todos los archivos que contengan la palabra "Robert" en cualquier lugar de sus nombres y cuyos nombres terminen en "pdf" o "jpg".


3

Como alternativa al uso de la -regexopción activada find, ya que la pregunta está etiquetada, puede utilizar el mecanismo de expansión de la abrazadera:

eval find . -false "-o -name Robert".{jpg,pdf}

buscar informe "las rutas deben preceder a la expresión", ¿cuál es el problema? Por lo general, agrego una cita para resolverlo, pero no funciona para esta expresión. ¡Gracias!
Netawater

Sospecho que olvidó evalo .en el comando anterior, o su findes un alias para algo más complicado, o no está usando el GNU estándar finden su versión de Linux.
jxh

Gracias por su respuesta, utilicé un script como este: FILEEXTEIONS = cs, [ch] eval find. -false "-o -name *". {$ FILEEXTEIONS}, e informa ese error.
Netawater

Hasta donde yo sé, la expansión variable no ocurrirá dentro de los tirantes de expansión de la riostra.
jxh

1
Quería usar esta técnica en un shell de Android pero findno es compatible -false. He trabajado en torno a esta dando dos condiciones mutuamente excluyentes por lo que son colectivamente falsa: -inum 1 -inum 2.
Starfry


1

Como script puedes usar:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print
  • guárdalo como findcc
  • chmod 755 findcc

y usarlo como

findcc [name] [[search_direcory]]

p.ej

findcc                 # default name 'Robert' and directory .
findcc Joe             # default directory '.'
findcc Joe /somewhere  # no defaults

nota que no puedes usar

findcc /some/where    #eg without the name...

también como alternativa, puede utilizar

find "$1" -print | grep "$@" 

y

findcc directory grep_options

me gusta

findcc . -P '/Robert\.(h|cpp)$'

1

Usar bash globbing (si findno es obligatorio)

ls Robert.{pdf,jpg} 

0

De forma recurrente con ls: (-al para incluir carpetas ocultas)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
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.