Quero iterar em cada linha na saída de: ls -l /some/dir/*
Agora estou tentando: for x in $(ls -l $1); do echo $x; done
No entanto, isso itera sobre cada elemento da linha separadamente, então eu obtenho:
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2
Mas eu quero iterar em cada linha como um todo. Como faço isso?
Respostas:
Defina IFS como nova linha, assim:
Coloque um sub-shell em torno dele se você não quiser definir o IFS permanentemente:
Ou use enquanto | leia em vez disso:
Mais uma opção, que executa o while / read no mesmo nível de shell:
fonte
read -r
ou então o bash removerá as barras invertidas sem escape dos dados.Depende do que você deseja fazer com cada linha. awk é um utilitário útil para esse tipo de processamento. Exemplo:
.. em meu sistema imprime o nome e o tamanho de cada item do diretório.
fonte
Como já foi mencionado, o awk é a ferramenta certa para isso. Se você não quiser usar o awk, em vez de analisar a saída de "ls -l" linha por linha, você pode iterar em todos os arquivos e fazer um "ls -l" para cada arquivo individual assim:
fonte
Você também pode tentar o
find
comando. Se você deseja apenas arquivos no diretório atual:Executar um comando em cada um deles?
Contar linhas, mas apenas em arquivos?
fonte
O utilitário read (1) junto com o redirecionamento de saída do comando ls (1) fará o que você quiser.
fonte
Então, por que ninguém sugeriu apenas usar opções que eliminam as partes que ele não quer processar.
No Debian moderno, você apenas obtém seu arquivo com:
Além disso, você não precisa prestar atenção em qual diretório está executando-o se usar o diretório completo:
Estou usando este último comando acima e obtenho a seguinte saída:
fonte