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 alspara um dadolocale'LC_COLLATE) -
stdbuf -o0(stdbufvem com GNUcoreutils) para tornar o fluxo STDOUT deprintf/echounbuffered - pipe (
|) o STDOUT deprintf/echoaawkeexitdepois de imprimir o primeiro registro - Após
awksair,stdbuf(printf) receberiaSIGPIPEe seria eliminado - Eu usaria
printfpara 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}'