Como listar todos os arquivos em um diretório com caminhos absolutos

30

Eu preciso de um arquivo (de preferência um arquivo .list) que contenha o caminho absoluto de cada arquivo em um diretório.

Exemplo dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

/Users/haddad/dir1/file1.txt
/Users/haddad/dir1/file2.txt
/Users/haddad/dir1/file3.txt

Como posso fazer isso no linux / mac?

arabian_albert
fonte

Respostas:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
fonte
isso funcionaria no red hat linux?
arabian_albert
4
Esse comando funciona em qualquer sistema operacional Linux ou UNIX. Se você deseja obter um arquivo por linha, você precisa usarls -d -1 $PWD/*
MelBurslan
11
se os nomes dos arquivos forem longos ou a largura do terminal for estreita, sim, esse será o caso, mas digamos que você tenha maximizado a janela do terminal para ocupar a tela inteira ou se os nomes dos arquivos (incluindo o caminho) são muito curtos, que não serão mantidos verdade. -1opção garante-lhe obter um nome de arquivo por linha
MelBurslan
7
A adição de @MelBurslan só é necessária se a saída for para um terminal. lsdetecta se a saída é para um arquivo ou terminal.
Runium 8/03/16
9
isso falhará se houver muitos milhares de arquivos no diretório, ou seja, o suficiente para exceder o tamanho máximo da linha de comando (tornado mais provável pelo fato de o shell estar expandindo os nomes dos arquivos com o caminho completo). A findresposta de @Andy Dalton é uma solução melhor, pois ela não falha, não importa quantos arquivos devem ser listados.
22816
33

Você pode usar o find. Supondo que você queira apenas arquivos regulares, você pode:

find /path/to/dir -type f > listOfFiles.list

Você pode ajustar o parâmetro type, conforme apropriado, se desejar outros tipos de arquivos.

Andy Dalton
fonte
7
+1 por apontar uma solução mais à prova de futuro ls. Isso findrecursiva os subdiretórios, para não recursivos você precisa adicionar o argumento -maxdepth 1before -type.
kubanczyk
@AndyDalton Como obter o mesmo para uma matriz em bash
Kasun Siyambalapitiya
13

Observe que em:

ls -d "$PWD"/* > listOfFiles.list

É o shell que calcula a lista de arquivos (não ocultos) no diretório e passa a lista para ls. lsapenas imprime essa lista aqui, para que você também possa:

printf '%s\n' "$PWD"/*
Stéphane Chazelas
fonte
3
Usar printftem o bônus adicional de que você não receberá um erro de 'linha de comando por muito tempo' se tiver milhares de arquivos, pois printfnão é executado como um processo separado.
Adrian Pronk
2
@AdrianPronk, sim, exceto em shells onde printfnão é incorporado e em pdkshalguns de seus derivados ou na maioria das versões do shell Bourne. Uma desvantagem em comparação ls -dé que, se não houver um arquivo não oculto, ele será impresso /path/to/*enquanto lsocorrerá um erro sobre a inexistência do arquivo .
Stéphane Chazelas
10

Para ver apenas arquivos regulares -

find "$PWD" -type f  > output
jai_s
fonte
3

Você pode apenas usar realpathou readlink:

ls | xargs realpath
  • xargs construir e executar linhas de comando a partir da entrada padrão.
  • realpath: retorna o caminho absoluto canonizado
  • readlink: ler valor de um link simbólico
Pablo A
fonte
realpath: comando não encontrado
rogerdpack 23/03
@rogerdpack você tem o pacote coreutils instalado? Eu recebo essa informação com dpkg -S /usr/bin/realpath. Confira isso .
Pablo A
3

Outra maneira de tree, não mencionado aqui, ocorrer recursivamente e, ao contrário de find ou se você não tiver nenhum erro (como:, ) Permission denied, Not a directoryvocê também obtém o caminho absoluto caso queira alimentar os arquivos xargsou outro comando

tree -fai /pathYouWantToList >listOfFiles.list

o significado das opções:

-a     All  files  are  printed.  By default tree does not print hidden files (those beginning with a dot
       `.').  In no event does tree print the file system constructs `.'  (current  directory)  and  `..'
       (previous directory).

-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

-f     Prints the full path prefix for each file.

Para instalar tree:

sudo apt install tree no Ubuntu / Debian

sudo yum install tree no CentOS / Fedora

sudo zypper install tree no OpenSUSE

Eduard Florinescu
fonte
11
árvore: comando não encontrado
rogerdpack 23/03
@rogerdpack sudo apt install treeno Ubuntu sudo yum install treeno CentOS sudo zypper install treeno OpenSUSE
Eduard Florinescu
11
brew install treeno Mac
oOEric
2

Em um ambiente Linux passado, eu tinha um resolvecomando que padronizava os caminhos, incluindo transformar um caminho relativo em um caminho absoluto. Não encontro agora, então talvez tenha sido escrito por alguém dessa organização.

Você pode criar seu próprio script usando funções nas bibliotecas padrão Python ou Perl (e provavelmente em outras linguagens também).

resolve.py :

#!/bin/env python

import sys
import os.path

for path in sys.argv:
    print os.path.abspath(path)

resolve.pl :

#!/bin/env perl

use warnings;
use Cwd qw ( abs_path );

foreach (@ARGV) {
    print abs_path($_), "\n";
}

Em seguida, você resolveria seu problema com:

resolve.py * > listOfFiles.list

Com este comando, você também pode fazer coisas como estas:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
jskroch
fonte