Come elencare tutti i file in una directory con percorsi assoluti


30

Ho bisogno di un file (preferibilmente un file .list) che contiene il percorso assoluto di ogni file in una directory.

Esempio dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

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

Come posso farlo in Linux / Mac?

Risposte:


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

funzionerebbe in Linux Red Hat?
arabian_albert

4
Tale comando funziona in qualsiasi sistema operativo Linux o UNIX. Se vuoi ottenere un file per riga, devi utilizzarels -d -1 $PWD/*
MelBurslan

1
se i nomi dei tuoi file sono lunghi o la larghezza del terminale è stretta, sì, sarà così, ma supponiamo che tu abbia ingrandito la finestra del terminale per occupare l'intero schermo o che i nomi dei tuoi file (incluso il percorso) siano davvero brevi, che non reggeranno vero. -1L'opzione ti garantisce di ottenere un nome file per riga
MelBurslan

7
L'aggiunta di @MelBurslan è necessaria solo se l'output è indirizzato a un terminale. lsrileva se l'output è su un file o un terminale.
Runium

9
questo fallirà se ci sono molte migliaia di file nella directory, cioè abbastanza da superare la dimensione massima della riga di comando (resa più probabile dal fatto che la shell sta espandendo i nomi dei file con il percorso completo). La findrisposta di @Andy Dalton è una soluzione migliore, poiché non fallirà, indipendentemente dal numero di file da elencare.
Cas

33

Puoi usare trova. Supponendo che desideri solo file regolari, puoi fare:

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

È possibile regolare il parametro type come appropriato se si desidera altri tipi di file.


7
+1 per indicare una soluzione più a prova di futuro ls. Questo findfa riferimento alle sottodirectory, per non ricorsive è necessario aggiungere -maxdepth 1prima -typedell'argomento.
kubanczyk,

@AndyDalton Come ottenere lo stesso con un array in bash
Kasun Siyambalapitiya

13

Si noti che in:

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

È la shell che calcola l'elenco dei file (non nascosti) nella directory e passa l'elenco a ls. lsstampa l'elenco qui, così puoi anche fare:

printf '%s\n' "$PWD"/*

3
L'utilizzo di printfha il vantaggio aggiuntivo che non si otterrà un errore "riga di comando troppo lunga" se si dispone di migliaia di file in quanto printfnon viene eseguito come processo separato.
Adrian Pronk,

2
@AdrianPronk, sì, tranne nelle shell in cui printfnon è incorporato like pdkshe alcuni dei suoi derivati ​​o la maggior parte delle versioni della shell Bourne. Uno svantaggio rispetto a ls -dè che se non ci sono file non nascosti, verrà stampato /path/to/*mentre lsti darà un errore su quel file che non esiste invece.
Stéphane Chazelas,

10

Per vedere solo i file regolari -

find "$PWD" -type f  > output

3

Puoi semplicemente usare realpatho readlink:

ls | xargs realpath
  • xargs costruire ed eseguire le righe di comando dall'input standard.
  • realpath: restituisce il percorso assoluto canonicalizzato
  • readlink: legge il valore di un collegamento simbolico

realpath: comando non trovato
rogerdpack

@rogerdpack hai installato il pacchetto coreutils ? Ottengo quelle informazioni con dpkg -S /usr/bin/realpath. Dai un'occhiata a questo .
Pablo A

3

Un altro modo con tree, non menzionati qui, si va in modo ricorsivo e trovare differenza o ls non si dispone di eventuali errori (come: Permission denied, Not a directory) si ottiene anche il percorso assoluto nel caso in cui si desidera alimentare i file xargso altro comando

tree -fai /pathYouWantToList >listOfFiles.list

le opzioni che significano:

-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.

Per installare tree:

sudo apt install tree su Ubuntu / Debian

sudo yum install tree su CentOS / Fedora

sudo zypper install tree su OpenSUSE


1
albero: comando non trovato
rogerdpack

@rogerdpack sudo apt install treesu Ubuntu sudo yum install treesu CentOS sudo zypper install treesu OpenSUSE
Eduard Florinescu

1
brew install treesu Mac
oOEric,

2

In un passato ambiente Linux, avevo un resolvecomando che avrebbe standardizzato i percorsi, incluso fare un percorso relativo in un percorso assoluto. Non riesco a trovarlo ora, quindi forse è stato scritto da qualcuno in quell'organizzazione.

Puoi creare il tuo script usando le funzioni nelle librerie standard di Python o Perl (e probabilmente anche in altre lingue).

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

Quindi, risolveresti il ​​tuo problema con:

resolve.py * > listOfFiles.list

Con questo comando, puoi anche fare cose come questa:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.