Comando LS: Como posso obter uma listagem de caminho completo recursivo, uma linha por arquivo?

StackOverflow https://stackoverflow.com/questions/1767384

  •  21-09-2019
  •  | 
  •  

Pergunta

Como posso fazer com que o LS cuspir uma lista plana de caminhos recursivos de uma linha?

Por exemplo, eu só quero uma lista plana de arquivos com seus caminhos completos:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 Quase faz o que preciso, mas não quero fragmentos de caminho, quero caminhos completos.

Foi útil?

Solução

Se você realmente quer usar ls, depois formate sua saída usando awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

Outras dicas

Use o encontro:

find .
find /home/dreftymac

Se você deseja apenas arquivos (omitir diretórios, dispositivos, etc.):

find . -type f
find /home/dreftymac -type f

ls -ld $(find .)

Se você deseja classificar sua saída por tempo de modificação:

ls -ltd $(find .)

Experimente a seguinte maneira mais simples:

find "$PWD"

O melhor comando é: tree -fi

Para usar os arquivos, mas não os links, você deve remover > da sua saída:

tree -fi |grep -v \>

Se você quiser saber a natureza de cada arquivo (para ler apenas arquivos ASCII, por exemplo) com dois whiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

Oh, realmente uma longa lista de respostas. Ajudou muito e, finalmente, criei o meu, o que estava procurando:

Para listar todos os arquivos em um diretório e seus subdiretos:

find "$PWD" -type f

Para listar todos os diretórios em um diretório e seus subdiretos:

find "$PWD" -type d

Para listar todos os diretórios e arquivos em um diretório e seus subdiretos:

find "$PWD"

Eu não sei sobre o caminho completo, mas você pode usar -R para recursão. Alternativamente, se você não estiver empenhado ls, você pode simplesmente fazer find *.

Usando nenhum comandos externos além de LS:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done

du -a

Handy para algumas conchas limitadas de aparelhos em que o Find/Locate não estão disponíveis.

Encontre / fará o truque

Eu acho que para uma lista plana da melhor maneira é:

find -D tree /fullpath/to-dir/ 

(ou para salvá -lo em um arquivo txt)

find -D tree /fullpath/to-dir/ > file.txt

Não o torne complicado. Acabei de usar isso e obtive uma bela saída:

ls -lR /path/I/need

A maneira mais fácil de todas as pessoas futuras é simplesmente:

du

No entanto, isso também mostra o tamanho do que contido em cada pasta que você pode usar para produzir apenas o nome da pasta:

du | awk '{print $2}'

Edit- Desculpe desculpe, meu mal. Eu pensei que eram apenas pastas necessárias. Vou deixar isso aqui, caso alguém no futuro precise de qualquer maneira ...

Com a liberdade de usar todas as opções possíveis de LS:

find -type f | xargs ls -1

Execute um comando bash com o seguinte formato:

find /path -type f -exec ls -l \{\} \;

Aqui está uma resposta parcial que mostra os nomes do diretório.

ls -mR * | sed -n 's/://p'

Explicação:

ls -mR * lista os nomes completos do diretório que terminam em um ':' e depois lista os arquivos nesse diretório separadamente

sed -n 's/://p' Encontra linhas que terminam em um cólon, tiram o cólon e imprimem a linha

Ao iterar sobre a lista de diretórios, também devemos encontrar os diretórios. Ainda está trabalhando nisso. É um desafio obter os curinga através de Xargs.

Adicionar um curinga ao final de um diretório LS força os caminhos completos. Agora você tem isso:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Você poderia fazer isso em vez disso:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

Infelizmente, isso não imprima o caminho completo para os diretórios recolocados, por isso pode não ser a solução completa que você está procurando.

ls -lR é o que você estava procurando, ou pelo menos eu era. Felicidades

Muitas respostas que vejo. Isso é meu, e acho bastante útil se você estiver trabalhando no Mac.

Tenho certeza que você sabe que existem alguns arquivos "pacote" (.aplicativo, .rtfd, .workflow, e assim por diante). E olhando para a janela do Finder, eles parecem arquivos únicos. Mas eles não são. E $ ls ou $ find Veja -os como diretórios ... então, a menos que você precise listar o conteúdo deles também, isso funciona para mim:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Claro que isso é para o diretor que trabalha, e você pode adicionar extensões de outros pacotes (mas sempre com um / depois deles). Ou quaisquer outras extensões, se não forem sem o /.

Bastante interessante o ".lpdf/"(PDF multilíngue). Tem normal".pdf"Extensão (!!) ou nenhum no Finder. Dessa forma, você recebe (ou apenas conta 1 arquivo) para isso pdf E não um monte de coisas ...

Se o diretório for passado como um caminho relativo e você precisará convertê -lo em um caminho absoluto antes de ligar para o Find. No exemplo seguinte, o diretório é passado como o primeiro parâmetro do script:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
tar cf - $PWD|tar tvf -             

Isso é lento, mas funciona recursivamente e imprime os diretórios e os arquivos. Você pode transmitir com AWK/Grep se você quiser apenas os nomes de arquivos sem todas as outras informações/diretórios:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

@GhostDog74: Pequeno ajuste com sua solução.
O código a seguir pode ser usado para pesquisar o arquivo com todo o seu caminho absoluto.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

Eu conhecia o nome do arquivo, mas também queria o diretório.

Encontre $ PWD | Nome do arquivo do FGREP

funcionou perfeitamente no Mac OS 10.12.1

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top