En este caso, GNU le find
permite hacer todas estas cosas de una vez, eliminando tuberías y el análisis potencialmente problemático de ls
:
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
(¡ find
no es una buena forma de modificar arbitrariamente la salida de otros comandos, por supuesto!)
Algunas notas:
-maxdepth 1
y -name [^.]*
hacer que la coincidencia de nombres funcione igual que un simple ls
(o ls .
). Puede usar cualquier globo de estilo shell, pero tenga en cuenta que "*" coincidirá con un "." en un nombre † diferente bash
, [^.]*
significa cualquier cosa que no tenga un "."
- MYPATTERN es un ERE POSIX adecuado (el tipo predeterminado es Emacs, consulte aquí ), pero debe coincidir con el nombre de archivo completo, así que use algo como en
.*thing.*
lugar de solothing
- probablemente pueda usar uno de
-name
/ en -regex
lugar de ambos (por ejemplo, -regex "[^.]. MYPATTERN " .
-printf
admite muchas cosas , %n
es el archivo sin nombre o el nombre del directorio
† (esto puede depender de su versión de find
, sin embargo, consulte la sección "CONFORMIDAD DE NORMAS" de su página de manual)
Como una alternativa posible sin necesidad de programas externos, bash
tiene compgen
que, entre otras cosas, expande globos, equivalente a un ls
sin opciones:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
Esto maneja los nombres de archivo con espacios en blanco, incluidas las nuevas líneas. compgen -G "*"
debería proporcionar el mismo resultado que un plano ls
(pero tenga en cuenta que ls *
es algo completamente diferente). Aún lo necesitará grep
, y esto puede o no resolver el problema, pero vale la pena mencionarlo.
ls
, es un mal juju. Además, ¿tiene que sergrep
? ¿Y puedes dar algún ejemplo de salida?