Isso é complicado. Duas abordagens:
Abordagem 1; find
:
find . -mindepth 1 -print -quit
find
e -print
s o primeiro arquivo encontrado e -quit
s imediatamente. -mindepth 1
impediria a correspondência do hardlink .
do diretório atual.
Se você estiver interessado apenas em arquivos regulares, adicione -type f
:
find . -type f -print -quit
-mindepth 1
pode ser descartado, pois o .
sendo um diretório não seria correspondido.
Abordagem 2; sh
, stdbuf
e awk
:
Note que, isso pode sofrer ARG_MAX
sendo acionado para muitos arquivos (a lista de argumentos está se tornando muito longa, acima de ARG_MAX
bytes). Nesse caso, use a abordagem 1.
- qualquer shell builin (por exemplo,
printf
,echo
) para imprimir o nome do arquivo - shell globbing,
*
, para fazer a expansão (a ordem de agrupamento deve ser igual als
para um dadolocale
'LC_COLLATE
) -
stdbuf -o0
(stdbuf
vem com GNUcoreutils
) para tornar o fluxo STDOUT deprintf
/echo
unbuffered - pipe (
|
) o STDOUT deprintf
/echo
aawk
eexit
depois de imprimir o primeiro registro - Após
awk
sair,stdbuf
(printf
) receberiaSIGPIPE
e seria eliminado - Eu usaria
printf
para obter os nomes de arquivos separados por ASCII NUL (
) e use %code% como o separador de registro em %code% para lidar com casos de borda no que diz respeito aos nomes de arquivosawk
Colocando estes juntos:
stdbuf -o0 printf '%sfind . -mindepth 1 -print -quit
' * | awk 'BEGIN{RS="find . -type f -print -quit
"} {print; exit}'