Soy nuevo en Linux. Tengo un directorio en Linux con aproximadamente 250,000 archivos. Necesito encontrar la cantidad de archivos que coincidan con un patrón.
Intenté usar el siguiente comando:
ls -1 20061101-20131101_kh5x7tte9n_2010_* | wc -lRecibí el siguiente mensaje de error:
-bash: /bin/ls: Argument list too long 0Por favor ayuda. Gracias por adelantado
Podría ser mejor usar find para esto:
find . -name "pattern_*" -printf '.' | wc -mEn su caso específico:
find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_2010_*" -printf '.' | wc -m find devolverá una lista de archivos que coincidan con los criterios. -maxdepth 1 hará que la búsqueda se realice solo en la ruta, sin subdirectorios ( ¡gracias Petesh! ). -printf '.' imprimirá un punto para cada coincidencia, de modo que los nombres con nuevas líneas no hagan que wc -m se rompa.
Entonces wc -m indicará el número de caracteres que coincidirá con el número de archivos.
Comparación de rendimiento de dos opciones posibles:
Vamos a crear 10 000 archivos con este patrón:
$ for i in {1..10000}; do touch 20061101-20131101_kh5x7tte9n_201_$i; done Y luego compare el tiempo que lleva obtener el resultado con ls -1 ... o find ... :
$ time find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_201_*" | wc -m 10000 real 0m0.034s user 0m0.017s sys 0m0.021s $ time ls -1 | grep 20061101-20131101_kh5x7tte9n_201 | wc -m 10000 real 0m0.254s user 0m0.245s sys 0m0.020s find es x5 veces más rápido! Pero si usamos ls -1f ( ¡gracias Petesh de nuevo! ), entonces ls es incluso más rápido que find :
$ time ls -1f | grep 20061101-20131101_kh5x7tte9n_201 | wc -m 10000 real 0m0.023s user 0m0.020s sys 0m0.012sobtuviste un "argumento demasiado largo" porque Shell expande tu patrón a la lista de archivos. tratar:
find -maxdepth 1 -name '20061101-20131101_kh5x7tte9n_2010_*' |wc -lpreste atención: el patrón está entre comillas para evitar la expansión del shell
Prueba esto:
ls -1 | grep 20061101-20131101_kh5x7tte9n_2010_ | wc -l