Eu acredito que a maneira mais simples de fazer o que você pede é:
$ ( cd d; ls *.txt )
1.txt 2.txt 3.txt
que está acontecendo dentro de um sub-shell ( ... )
, então a alteração do diretório não é permanente, é válida apenas para a execução dos dois comandos.
Uma versão mais robusta é:
$ ( cd d && ls -d -- *.txt )
1.txt 2.txt 3.txt
Em que ls
não é executado, a menos que a alteração do diretório tenha sido bem-sucedida, e ls
lista diretórios em vez de seu conteúdo e não aceita arquivos cujo nome comece com um traço como na opção.
Se você não se importa em alterar os parâmetros posicionais ( $1
, $2
, etc.):
Isso também é relativamente simples:
$ set d/*.txt
$ for f do printf '%s\n' "${f#d/}"; done
1.txt
2.txt
3.txt
Isso funcionará em shells POSIX:
$ dash -c 'set d/*.txt; for f do printf "%s\n" "${f#d/}"; done'
1.txt
2.txt
3.txt
Você pode usar o -printf
:
$ find d -maxdepth 1 -iname "*.txt" -printf "%f\n" | sort
1.txt
2.txt
3.txt
Mas isso está ficando complexo o suficiente. Desculpe, não há mais soluções "simples" AFAIK.