Como obter uma nova linha no final do comando pipe

0

Eu quero escrever uma sequência canalizada de comandos que imprima uma lista de todos os subdiretórios do diretório fornecido e impressa em uma linha, seguindo uma nova linha.

Estou com problemas para fazer com que a saída do comando a seguir esteja na mesma linha e tenha uma nova linha no final.

Este é o meu comando pipe:

ls -l /share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' 

Eu gostaria que a saída fosse como:

file1 file3
[user@linux]$

E não (o que eu realmente obtenho:

file1 file3[user@linux]$
    
por user2953423 16.11.2015 / 09:09

5 respostas

3

Parece que você deseja obter apenas nomes de diretório. Nesse caso, você pode usar find :

find /share -maxdepth 1 -type d -printf '%f\n'

Exemplo:

% find /usr -maxdepth 1 -type d -printf '%f\n'
usr
include
lib
share
sbin
local
bin
games
lib32
src

Resposta original:

Use um shell inteligente como zsh ou use printf :

printf '%s\n' "$(ls -l /share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ')"

Dê uma olhada em help printf .

    
por heemayl 16.11.2015 / 09:14
2

E sobre:

ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' && echo " "
    
por Julen Larrucea 16.11.2015 / 09:15
1

Por que ls , grep , cut , ...?

Use awk e find :

find /usr/share -maxdepth 1 -type d | awk -F/ '{printf "%s ",$NF} END {print ""}'
    
por A.B. 16.11.2015 / 09:26
1
% bl0ck_qu0te%

Você não precisa de uma seqüência de comandos para isso; você pode usar a expansão de nome de arquivo do Bash A propósito, você precisará de uma seqüência de comandos para isso, já que aparentemente você não quer imprimir o "/":

echo */ | tr -d '/'
  • echo */ : imprime */ , que é um padrão globbing que é expandido para qualquer pasta / arquivo no diretório de trabalho atual que termina com / (somente para pastas);
  • tr -d '/' : exclui o "/" final. Não há preocupação de que "/" possa aparecer no nome do arquivo, pois "/" não é um caractere válido para um nome de arquivo.
% mkdir dir{1..3}
% touch file{1..3}
% tree
.
├── dir1
├── dir2
├── dir3
├── file1
├── file2
└── file3

3 directories, 3 files
% echo */ | tr -d '/'
dir1 dir2 dir3
%
    
por kos 16.11.2015 / 09:34
0

A solução mais simples seria simplesmente adicionar um comando echo simples, sem nenhum argumento, ao final do comando:

ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' ; echo

Se você não gostar dos comandos para serem vinculados a ; , também poderá usar:

echo $(ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ')
    
por Byte Commander 16.11.2015 / 09:14