Dos soluciones:
Un bucle de concha:
for name in /usr/bin/*file*; do
case "${name##*/}" in
*[!a-z]*) ;;
*) printf '%s\n' "$name"
esac
done
Esto primero genera una lista de nombres de ruta bajo /usr/bin
cuyo nombre base coincide con *file*
y luego comprueba si esos nombres base también contienen caracteres que no son letras minúsculas. Si no se encuentran letras minúsculas que no sean -, se imprime el nombre de ruta.
Esto potencialmente también encontraría nombres de directorios que cumplan con los criterios. Si eso no es lo que quieres, solo haz
[ ! -f "$name" ] && continue
antes de la instrucción case
para omitir todos los nombres que no sean archivos normales.
Usando GNUfind
:
find /usr/bin -maxdepth 1 -type f -name '*file*' -regex '.*/[a-z]*$'
Esto también hace un filtrado de dos etapas. Primero en el nombre base que debe coincidir con *file*
, y luego al final del nombre de ruta(-regex
coincide con el nombre de ruta completo )para asegurarse de que solo haya letras minúsculas allí.
При использовании конвейера оболочка выполняет каждую команду в конвейере одновременно и ждет завершения всех из них, прежде чем перейти к следующей команде. Это объясняется в документации :
.If the pipeline is not executed asynchronously (see Lists), the shell waits for all commands in the pipeline to complete.
Когда вышеприведенное относится к асинхронному выполнению конвейера, речь идет о запуске всего конвейера в фоновом режиме с &
.
Когда вы используете подстановку процесса, оболочка не ожидает ее завершения. Документация просто говорит:
The process list is run asynchronously, and its input or output appears as a filename.