Como sl sem recursiva

19

Estou tentando alguns arquivos com um padrão em um diretório. Eu só quero escanear o primeiro nível não recursivo.

Meu script:

for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*)
do
  echo $i;
done

O comando acima verifica recursivamente. Como fazê-lo apenas para verificar o diretório de primeiro nível?

Sas
fonte
printf %s\\n "$INCOMINGDIR/"*"$BUSINESSDATE"*
mikeserv

Respostas:

39

Não analisels . Também não use ALL_CAPS_VARS

for i in "$incoming_dir"/*"$business_date"*; do

Interativamente, lstem uma -dopção que impede a descida em subdiretórios:

ls -d $INCOMINGDIR/*$BUSSINESSDATE*
Glenn Jackman
fonte
Obrigado pela informação, vou começar a criar arquivos com novas linhas no nome apenas para irritar os administradores de sistemas agora.
Petah
É por isso que o sysadmin / programador inteligente usa "${i}". Você nunca sabe o que pode estar em i.
Ricky feixe
@Petah: ou alguém com más intenções pode criar um arquivo nomeado my_file.doc[newline]another_persons_file.doce torcer para que alguns scripts tentem "rm" o que ele vê como 2 nomes de arquivos ... O link de Glenn é uma leitura obrigatória (em mywiki.wooledge.org, todos devem ler o faq inteiro, e também a página das armadilhas)
Olivier Dulac
1
legal. eu não conhecia a opção -d!
Dokaspar 16/05/19
Ótimo! Isso funciona para coisas mais simples também. Como a lista de todos os arquivos com prefixo de ponto:ls -d .*
Wassadamo
8

Não há razão para que este comando seja recursivo. Mas se $INCOMINGDIR/*$BUSSINESSDATE*corresponder a um diretório, o conteúdo desse diretório será mostrado em vez do próprio diretório. Mas não haveria recursão além desse nível.

Use este comando para evitar esse efeito:

ls -d "$INCOMINGDIR/"*"$BUSSINESSDATE"*

for ... incomandos com lssaída são arriscados.

Em geral, findparece uma solução melhor ou

for i in "$INCOMINGDIR/"*"$BUSSINESSDATE"*
Hauke ​​Laging
fonte