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.