Obtém todos os caminhos de arquivo de um determinado ponto e pipe para o arquivo de texto

0

Se o meu terminal estiver atualmente em home/stuff/stuff2 e houver mais pastas e arquivos em stuff2 , como posso iniciar um comando para obter os nomes de arquivos de todos os arquivos e pastas deste diretório e em diante (incluindo todos os sub diretórios).

A operação precisa fazer o seguinte:

  1. O caminho do arquivo deve começar no local do comando terminal, portanto, não quero caminhos de arquivos completos. Exemplo, em vez de a leitura ser home/stuff/stuff2/stuff3/cat.png preferiria que a leitura fosse stuff3/cat.png
  2. Ele deve capturar todos os arquivos, pastas e arquivos dessas pastas.
  3. Ele precisa ser canalizado (acho que esse é o termo) para um arquivo de texto.

Alguma idéia?

    
por Joseph 15.11.2014 / 02:49

3 respostas

2

O comando

find -printf "%P\n" > file

listará todos os arquivos e diretórios abaixo do diretório atual e redirecionará a lista para file . Da seção printf de man find

  %P     File's name with the name of the command  line  argument
         under which it was found removed.
    
por steeldriver 15.11.2014 / 03:01
2

Além de find , também é possível fazer isso apenas com o bash shell:

shopt -s globstar
printf "%s\n" ** >file

Todos os nomes dos arquivos de saída são impressos relativos ao diretório atual.

shopt -s globstar ativa globstar , o que dá bash parte do poder de find . Com globstar , duas estrelas em fila, como man bash , "correspondem a todos os arquivos e zero ou mais diretórios e subdiretórios". Aqui, printf é usado para formatar os nomes dos arquivos, um para uma linha. A saída é enviada para um arquivo de texto chamado file .

Nomes de arquivos com caracteres especiais

Esta pergunta pede saída em um arquivo de texto. Arquivos de texto geralmente possuem linhas separadas por caracteres de nova linha. Se qualquer nome de arquivo ou diretório contiver um caractere de nova linha, isso causará confusão. A menos que se saiba que não existe tal arquivo, é melhor usar um arquivo separado por nulo, não um arquivo de texto separado por nova linha.

Nesse caso, pode-se usar:

printf "%s
find -print0 >file
0" ** >file

Ou

shopt -s globstar
printf "%s\n" ** >file

Como o caracter nulo (ascii 000) nunca é permitido em um nome de arquivo, esse é o formato que pode ser usado para armazenar nomes de arquivos em um arquivo sem o risco de perder informações.

    
por John1024 15.11.2014 / 03:47
1

Se você puder manipular o arquivo no formato "./dir/filename", uma forma simples do comando find funcionaria:
find . -type f > filename canalizará todos os arquivos abaixo do diretório atual para "filename". / p>

Depois de ver a resposta da @ steeldriver, uma combinação de sua solução e a minha eliminaria o prefixo "./", assim:

Se você não deseja nomes de diretório em branco na lista (ou seja, apenas os nomes de arquivos em cada diretório,% find -type f -printf "%P\n" > file

Se você realmente fizer quiser os nomes de diretórios sozinhos junto com o diretório / nomes de arquivos, omita o sinalizador "-type f" de todos os exemplos.

    
por Marty Fried 15.11.2014 / 03:05