2011-05-08 22 views
273

Estoy tratando de encontrar todos los archivos con una extensión específica en un directorio y sus subdirectorios con mi bash (última versión de Ubuntu LTS).Buscar recursivamente archivos con una extensión específica

Esto es lo que está escrito en un archivo de script:

#!/bin/bash 

directory="/home/flip/Desktop" 
suffix="in" 

browsefolders() 
    for i in "$1"/*; 
    do 
    echo "dir :$directory" 
    echo "filename: $i" 
    # echo ${i#*.} 
    extension=`echo "$i" | cut -d'.' -f2` 
    echo "Erweiterung $extension" 
    if  [ -f "$i" ]; then   

     if [ $extension == $suffix ]; then 
      echo "$i ends with $in" 

     else 
      echo "$i does NOT end with $in" 
     fi 
    elif [ -d "$i" ]; then 
    browsefolders "$i" 
    fi 
    done 
} 
browsefolders "$directory" 

Por desgracia, cuando comienzo a esta secuencia de comandos en el terminal, que dice:

[: 29: in: unexpected operator 

(con $extension en lugar de 'in')

¿Qué está pasando aquí? ¿Dónde está el error? Pero esta llave de

+1

El error es de un desaparecido '{' – shrewmouse

+1

¿Puede marcar una respuesta como correcta? –

Respuesta

508
find $directory -type f -name "*.in" 

es un poco más corto que todo eso (y más seguros - se ocupa de los espacios en blanco en los nombres de archivo y nombres de directorio).

Su secuencia de comandos probablemente está fallando para las entradas que no tienen un . en su nombre, por lo que $extension está vacío.

+0

¿Esto funciona recursivamente también? – flip

+5

sí, 'find' es recursivo por defecto.puede limitar las profundidades si lo desea (consulte la página de manual). – Mat

+1

Me gustaría pasar todos los archivos encontrados como argumentos a un archivo jar. ¿Cómo puede esto ser realizado? – flip

9
  1. Hay una falta después de {browsefolders()
  2. $in Todo debe ser $suffix
  3. La línea con cut que recibe sólo la parte media de front.middle.extension. Debe leer el manual de su shell en ${varname%%pattern} y sus amigos.

Asumo que hace esto como un ejercicio de shell scripting, de lo contrario la solución find ya se ha propuesto es el camino a seguir.

Para comprobar la sintaxis del shell adecuada, sin ejecutar un script, use sh -n scriptname.

51

La sintaxis de uso es un poco diferente a lo que sugirió @ Matt:

find $directory -type f -name \*.in 

(que es uno menos de pulsaciones de teclas).

+1

La secuencia de comandos de Matt tampoco funcionará si hay un archivo con extensión .in en el directorio actual, mientras que el suyo seguirá funcionando. Consulte http://stackoverflow.com/questions/5927369/recursively-look-for-files-with-a-specific-extension#comment22990599_5927391 – Shnatsel

+4

@Shnatsel este comentario (y por lo tanto el suyo) es completamente incorrecto. –

+1

@gniourf_gniourf Debe proporcionar alguna referencia para su declaración, de lo contrario uno simplemente podría argumentar: "No, usted está equivocado". Pero, de hecho, tiene razón: https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html – Murmel

71
find {directory} -type f -name '*.extension' 

ejemplo para encontrar todos los archivos CSV en el directorio actual

find . -type f -name '*.csv' 
5

permite encontrar todos los archivos pom.xml en el directorio actual e imprimirlos, puede utilizar:

find . -name 'pom.xml' -print 
-1
find $directory -type f -name "*.in"|grep $substring 
9

Sin utilizar find:

du -a $directory | awk '{print $2}' | grep '\.in$' 
+3

El 'grep' no es realmente necesario aquí. 'awk' tiene expresiones regulares y podría limitar su salida a valores que coincidan con un patrón. – Kenster

+0

Este método es extremadamente útil si estás pasando por cientos de terabytes. El comando Buscar toma demasiado tiempo para procesarse. Esto comienza de inmediato. – Protonova

+0

'awk | grep' es un antipatrón. Deje que awk haga el grepping. – Jens

Cuestiones relacionadas