Eu devo repetir apenas nomes de arquivos ou diretórios com esta construção:
ls -Al | while read string
do
...
done
ls -Al
resultado :
drwxr-xr-x 12 s162103 studs 12 march 28 12:49 personal domain
drwxr-xr-x 2 s162103 studs 3 march 28 22:32 public_html
drwxr-xr-x 7 s162103 studs 8 march 28 13:59 WebApplication1
Por exemplo, se eu tentar:
ls -Al | while read string
do
echo "$string" | awk '{print $9}
done
em seguida, produza apenas arquivos e diretórios sem espaços. Se o arquivo ou diretório tiver espaços como "domínio pessoal", será apenas a palavra "pessoal".
Eu preciso de uma solução muito simples. Talvez exista uma solução melhor do que o awk.
linux
command-line
ls
Alex Zern
fonte
fonte
ls -Al *' '*
?ls
A saída da análise nunca leva a nada de bom.ls -Al | while
. Uma maneira simples e mais confiável éfor string in *; do echo "$string"; done
.ls
? A análisels
e o "trabalho em todos * nix e não serão interrompidos se algo acontecer" não funcionam bem juntos.Respostas:
Você realmente não deve analisar a saída de
ls
. Se for uma tarefa de casa e você precisar, seu professor não sabe do que está falando. Por que você não faz algo assim:O bom...
ou
...o mal...
Se você realmente deseja usar
ls
, pode torná-lo um pouco mais robusto fazendo algo como isto:... e o feio
Se você insistir em fazê-lo da maneira errada e perigosa e apenas precisar usar um
while
loop, faça o seguinte:Sério, apenas não.
fonte
drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItems
Às vezes eu tenho data sem tempo, só no ano e embasbacar retornar vazials
.-l
troca, afinal? Se tudo o que você deseja são os nomes dos arquivos, basta executarls -A
. Usar-l
apenas dificulta sua vida, pois agora você precisa analisar a saída.ls
simplesmente não é a melhor maneira de conseguir o que você precisa. Por que você não publica uma nova pergunta explicando as informações que deseja coletar e podemos sugerir maneiras de fazê-lo. Como alternativa, você pode usar seu script como está e usar uma das sugestões acima para imprimir apenas o nome. Mas,ls
falando sério, não analise , diga-nos exatamente o que você está tentando fazer em uma nova pergunta.Existe alguma razão para
ls -A1
* não funcionar?Por exemplo:
* Nota: é uma letra maiúscula A e o número um.
fonte
Gostaria de saber por que ninguém mencionou este comando simples:
fonte
sort
faz com que o bloco com várias colunas seja desmembrado em uma única coluna?ls
revertido parals -1
(saída de coluna única) quando sua saída não vai para um terminal (e desativa a citação / substituição de caracteres não imprimíveis; @Kusalananda, o seuls
não é compatível com POSIX, se ainda o fizer).ls
a saída já está classificada. Portanto, canalizá-lo parasort
, na melhor das hipóteses, não fazer nada e, na pior das hipóteses, alterar a saída (se os nomes dos arquivos contiverem caracteres de nova linha) ou falhar em nomes de arquivos que não sejam texto.ls -a | cat
seria melhor. Ou melhor aindals -A1
, como já mencionado (e porque você geralmente não quer que as substituições / citando quando exibido em um terminal)ls
se comporta de maneira diferente quando a saída não é um terminal.Você não pode analisar a saída de
ls
, muito menosls -l
porque a nova linha, assim como o espaço é um caractere tão válido quanto qualquer outro em um nome de arquivo. Além disso, você precisará considerar links simbólicos com saída semelhante... foo -> bar
.Por que você usaria de
-l
qualquer maneira se você deseja apenas o nome do arquivo?Apenas faça:
Se você deseja incluir arquivos de ponto (exceto
.
e..
), dependendo do shell:zsh
:bash
:ksh93
:POSIXly:
fonte
E se:
fonte
compactar vários espaços em espaços únicos com tr, você pode usar recortar para dividir nos campos
fonte
Tente (
bash
,zsh
,ksh93
sintaxe):Veja também:
ls
? no unix SEfonte
tente
ls -1
isso é inteiro 1Da página do manual.
fonte
exibe quais arquivos em qual diretório.
fonte