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!

A1X
fuente
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
Día nubloso
fuente
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' \)
Etan Reisner
fuente
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".

Mark Setchell
fuente
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}
jxh
fuente
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)$'
jm666
fuente
1

Usar bash globbing (si findno es obligatorio)

ls Robert.{pdf,jpg} 
una vez
fuente
0

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

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
wuseman
fuente