[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: LS



On Tue, Mar 18, 2014 at 06:48:54PM -0430, Edward Villarroel (EDD) wrote:
> buenas tardes
> 
> 
> alguna ves en mi vida me parecio haber leido sobre formas de buscar
> archivos con ls
> 
> ahora bien explicare con un ejemplo para ver si alguien me puede ayudar
> 
> tengo una carpeta con muchos archivos .log cuyo formato de nombre es algo como:
> 
> edward_yyyy_mm_dd
> edward_2014_01_26
> edward_2014_01_27
> edward_2014_01_28
> edward_2014_01_29
> ...........
> edward_2014_02_26
> edward_2014_02_27
> edward_2014_04_28
> edward_2014_05_29
> .......
> 
> y quiero la lista de todos los archivos de cada ciertos meses
> tengo la forma poco practica de hacerlos asi
> 
> ls -lr edward_2014_01*  edward_2014_02* edward_2014_03*
> 
> cuando quiero ver los archivos generados esos meses
> pero se que hay una forma de escribir menos lo digo por a en ocaciones
> no son 3 meses sino años
> 
> si alguien me puede ayudar
> 
> 
> 
> 
> Edward Villarroel:  @Agentedd
No es 'ls' lo que hace el trabajo, sino bash. Bash y otros shells
tienen un mecanismo denominado "globbing", que te permite usar
patrones parecidos a las expresiones regulares, con los cuales puedes
hacer cosas como:

$ ls -lr edward_2014_0[123]*
$ ls -lr edward_2014_0@(1|2|3)*
...

La primera forma es un glob normal. El [...] representa UN solo
caracter, cualquiera de los 3 enumerados. La segunda forma requiere
de 'extglob' (habilitado con: shopt -s extglob), para usar patrones
más avanzados.


Los elementos que puedes utilizar para formar tus patrones son:

- ?   el cual hace 'match' de un solo caracter, es como el '.' en
  regex

- *   el cual hace 'match' de cero o más caracteres, de cualquier
  tipo (comodín)

- [abc] el cual hace 'match' a un solo caracter, si el caracter está
  en el conjunto expresado ('a', 'b', o 'c')

- [a-z] el cual hace 'match' al rango de caracteres que van desde la
  'a' hasta la 'z', según la configuración que tengas de 'locale'.


Por ejemplo, archivos de los años 2012, 2013, y 2014:

$ ls -lr edward_201[234]_*

Para selecciones más complejas, requieres de extglob. Por ejemplo,
los archivos de los años de 1995 a 1997 y de 2003 a 2005:

$ shopt -s extglob
$ ls -lr edward_@(199[567]|200[345])_*


Con 'extglob' en bash puedes usar:

- @(a|b|c)    alternativas
- ?(abc)      opcional,
y otros más, pero te recomiendo que leas el manual de bash para más
detalle.


-- 
Eduardo Alan Bustamante López


Reply to: