Cómo enumerar todos los archivos en un directorio con rutas absolutas

30

Necesito un archivo (preferiblemente un archivo .list) que contenga la ruta absoluta de cada archivo en un directorio.

Ejemplo dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

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

¿Cómo puedo lograr esto en Linux / Mac?

arabian_albert
fuente

Respuestas:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
fuente
¿Funcionaría esto en Red Hat Linux?
arabian_albert
44
Ese comando funciona en cualquier sistema operativo Linux o UNIX. Si desea obtener un archivo por línea, debe usarls -d -1 $PWD/*
MelBurslan
1
si sus nombres de archivo son largos o el ancho del terminal es estrecho, sí, ese será el caso, pero supongamos que maximizó la ventana del terminal para ocupar toda la pantalla o que los nombres de sus archivos (incluida la ruta) son realmente cortos, eso no se mantendrá cierto. -1opción garantiza que obtenga un nombre de archivo por línea
MelBurslan
77
La adición de @MelBurslan solo es necesaria si la salida es a un terminal. lsdetecta si la salida es a un archivo o terminal.
Runium
99
esto fallará si hay muchos miles de archivos en el directorio, es decir, suficiente para exceder el tamaño máximo de la línea de comando (hecho más probable por el hecho de que el shell está expandiendo los nombres de los archivos con la ruta completa). La findrespuesta de @Andy Dalton es una mejor solución, ya que no fallará sin importar cuántos archivos se enumeren.
cas
33

Puedes usar find. Suponiendo que solo desea archivos normales, puede hacer:

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

Puede ajustar el parámetro de tipo según corresponda si desea otros tipos de archivos.

Andy Dalton
fuente
77
1 para señalar una solución más a prueba de futuro que ls. Esto findrecurre a los subdirectorios, para los no recursivos debe agregar -maxdepth 1antes del -typeargumento.
kubanczyk
@AndyDalton Cómo obtener lo mismo para una matriz en bash
Kasun Siyambalapitiya
13

Tenga en cuenta que en:

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

Es el shell que calcula la lista de archivos (no ocultos) en el directorio y le pasa la lista ls. lssolo imprime esa lista aquí, así que también podrías hacer:

printf '%s\n' "$PWD"/*
Stéphane Chazelas
fuente
3
El uso printftiene la ventaja adicional de que no obtendrá un error de "línea de comando demasiado larga" si tiene miles de archivos, ya printfque no se ejecuta como un proceso separado.
Adrian Pronk
2
@AdrianPronk, sí, excepto en shells donde printfno está integrado pdkshy algunos de sus derivados o la mayoría de las versiones del shell Bourne. Un inconveniente en comparación con esto ls -des que si no hay un archivo no oculto allí, se imprimirá /path/to/*y lsle dará un error acerca de que ese archivo no existe.
Stéphane Chazelas
10

Para ver solo archivos regulares:

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

Puedes usar realpatho readlink:

ls | xargs realpath
  • xargs construir y ejecutar líneas de comando desde la entrada estándar.
  • realpath: devuelve el nombre de ruta absoluto canonicalizado
  • readlink: valor de lectura de un enlace simbólico
Pablo A
fuente
realpath: comando no encontrado
rogerdpack
@rogerdpack ¿tiene instalado el paquete coreutils ? Tengo esa información con dpkg -S /usr/bin/realpath. Mira esto .
Pablo A
3

Otra forma con tree, no mencionada aquí, es recursiva y, a diferencia de find o ls no tiene ningún error (como:) Permission denied, Not a directorytambién obtiene la ruta absoluta en caso de que desee alimentar los archivos xargsu otro comando

tree -fai /pathYouWantToList >listOfFiles.list

las opciones que significan:

-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 en Ubuntu / Debian

sudo yum install tree en CentOS / Fedora

sudo zypper install tree en OpenSUSE

Eduard Florinescu
fuente
1
árbol: comando no encontrado
rogerdpack
@rogerdpack sudo apt install treeen Ubuntu sudo yum install treeen CentOS sudo zypper install treeen OpenSUSE
Eduard Florinescu el
1
brew install treeen Mac
oOEric
2

En un entorno Linux anterior, tenía un resolvecomando que estandarizaría las rutas, incluida la creación de una ruta relativa en una ruta absoluta. No puedo encontrarlo ahora, así que tal vez fue escrito por alguien de esa organización.

Puede crear su propio script utilizando funciones en las bibliotecas estándar de Python o Perl (y probablemente también en otros idiomas).

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";
}

Entonces, resolverías tu problema con:

resolve.py * > listOfFiles.list

Con este comando, también puedes hacer cosas como esta:

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