Comando ls: come posso ottenere un elenco ricorsivo a percorso completo, una riga per file?


493

Come posso ottenere ls per sputare un elenco piatto di percorsi ricorsivi one-per-line?

Ad esempio, voglio solo un elenco semplice di file con i loro percorsi completi:

/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 fa quasi quello di cui ho bisogno, ma non voglio frammenti di percorso, voglio percorsi completi.


Vedi anche: albero
dreftymac,

Risposte:


386

Se vuoi davvero usarlo ls, quindi formatta il suo output usando awk:

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

5
@dreftymac, il che significa che questa è, oggettivamente parlando, la risposta giusta alla domanda che hai scritto, intenzionalmente o no. Sì, forse non era la risposta giusta alla domanda che speravi di aver scritto. E mentre sono d'accordo con il tuo punto più grande: "quando il saggio punta verso la luna, lo sciocco guarda il dito" è giusto che minimizziamo l'impatto della soggettività per valutare la correttezza, specialmente quando i criteri non hanno alcuna possibile ambiguità
Lurscher,

1
@dreftymac, sarò felice di cambiare il mio voto, ma ora è bloccato, è necessario modificare la domanda in modo da poter aggiornare il voto
lurscher,

7
Qualcuno può spiegare le awkespressioni di cui sopra ?
Mert Nuhoglu,

2
Questa soluzione non omette le directory (ogni directory ha una propria linea)
JayB,

2
Grazie. A proposito, sarebbe bello avere questo in 1 riga per copia e incolla veloci.
Leo Ufimtsev,

567

Usa trova:

find .
find /home/dreftymac

Se vuoi solo file (ometti directory, dispositivi, ecc.):

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

2
possono lsparametri come --sort=extension"redenta" di questa soluzione?
n611x007,

È anche possibile utilizzare l'output di printf per visualizzare le informazioni contestuali necessarie (ad es. Find. -Type f -printf '% p% u \ n')
xsubira

Questo può essere formattato con un falg? vale a dire. python pprint.pprint (file)
Nathan

72

ls -ld $(find .)

se si desidera ordinare l'output in base al tempo di modifica:

ls -ltd $(find .)


11
-bash: / bin / ls: lista argomenti troppo lunga
jperelli

1
+1 ha funzionato per me con 12106 file e ho potuto usare il --sort=extensionparametro dils
n611x007 il

3
Grazie. Non avrei pensato da solo a quella (bella e breve) sintassi - avrei usato find . -name "*" -exec ls -ld '{}' \;(che funziona qualunque sia il numero di file), ma il tuo comando è molto più breve da scrivere;)
SRG

1
ls -ld $ (find.) si rompe per me se sto elencando un disco NTFS in cui i file hanno spazi: ls: impossibile accedere ./Sistema: nessun file o directory di questo tipo tuttavia trova tra virgolette di @SRG funziona
kuz8

Un'alternativa più breve (a seconda delle tue esigenze) sarebbe find . -ls.
IanS,

59

Prova il seguente modo più semplice:

find "$PWD"

9
find "`pwd`"se il percorso contiene spazi o altri caratteri speciali.
mustafa.0x

7
In che modo è diverso da find .? -.-
Salman von Abbas il

7
@SalmanPK Se dai a find un percorso assoluto come pwdper cominciare, stamperà percorsi assoluti. A proposito, "In che modo è diverso da find" ;-)
yckart

44

Il miglior comando è: tree -fi

Per utilizzare i file ma non i collegamenti, è necessario rimuovere >dall'output:

tree -fi |grep -v \>

Se vuoi conoscere la natura di ciascun file, (per leggere solo i file ASCII per esempio) con due whiles:

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

Grazie, non lo sapevo tree!
Dan Filimon

@Nakilon qual è la cosa più vicina? Visualizza l'output in modo simile? Come visualizzeresti facilmente un output simile con un breve comando?
om01,

6
@ om01: su osx è difficile come brew install tree, dato che stai usando homebrew
ccpizza,

non ho potuto elencare i file esclusivelty. elenca sempre anche le directory. Come lo posso fare?
kommradHomer,

Questo dovrebbe essere valutato molto più in alto!
der_grund,

44

Oh, davvero un lungo elenco di risposte. Mi ha aiutato molto e alla fine ho creato il mio che stavo cercando:

Per elencare tutti i file in una directory e nelle sue sottodirectory:

find "$PWD" -type f

Per elencare tutte le directory in una directory e le sue sottodirectory:

find "$PWD" -type d

Per elencare tutte le directory e i file in una directory e nelle sue sottodirectory:

find "$PWD"

2
E per filtrare per estensione:find "$PWD" -type f | grep '\.json$'
Killroy,

2
Non c'è bisogno di post-elaborazione con grep, usa -name in find like: trova "$ PWD" -type f -name * .json e se vuoi cancellare i file elencati: trova "$ PWD" -type f -name * .json -exec rm {} \; allo stesso modo, se vuoi copiarlo, sostituisci rm con cp e destination: -exec cp {} destination
Godfather

18

Non conosco il percorso completo, ma è possibile utilizzare -Rper la ricorsione. In alternativa, se non sei piegato ls, puoi semplicemente farlo find *.


16

Utilizzando nessun comando esterno diverso da ls:

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


Opzione sconosciuta '-1'. Interruzione.
ilw

15
du -a

Comodo per alcune shell di appliance limitate dove find / Locate non sono disponibili.


1
qualche idea su come posso rimuovere la dimensione del file senza awk?
Arnold Roa,


10

Non complicarlo. Ho appena usato questo e ho ottenuto un bellissimo risultato:

ls -lR /path/I/need

3
OP vuole solo il percorso completo e nient'altro. ls -lRnon raggiungerebbe questo obiettivo.
codeforester

scusa, non lo fa
Aryeh Beitz,

9

Il modo più semplice per tutte le persone future è semplicemente:

du

Questo, tuttavia, mostra anche la dimensione di ciò che è contenuto in ogni cartella. Puoi usare awk per generare solo il nome della cartella:

du | awk '{print $2}'

Modifica- Scusa scusa, mia cattiva. Pensavo fossero necessarie solo le cartelle. Lo lascerò qui nel caso in cui qualcuno in futuro ne abbia comunque bisogno ...


Interessante, perché mi mostra cose che non sapevo di voler sapere - un po 'come suggeriscono Google. Si scopre, mi piace sapere quanto spazio occupa ogni file.
Jake Toronto,

9

Con la libertà di utilizzare tutte le opzioni ls possibili:

find -type f | xargs ls -1


9

Penso che per una lista piatta il modo migliore sia:

find -D tree /fullpath/to-dir/ 

(o per salvarlo in un file txt)

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

3
Provato su Mac OS 10.13.3. find: illegal option -- D
Jayant Bhawal,

8

Esegui un comando bash con il seguente formato:

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

6

Ecco una risposta parziale che mostra i nomi delle directory.

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

Spiegazione:

ls -mR * elenca i nomi di directory completi che terminano con un ':', quindi elenca i file in quella directory separatamente

sed -n 's/://p' trova le linee che finiscono in due punti, rimuove i due punti e stampa la linea

Esaminando l'elenco delle directory, dovremmo essere in grado di trovare anche le directory. Ci sto ancora lavorando. È una sfida ottenere i caratteri jolly attraverso xargs.


ottima risposta .. esattamente quello di cui avevo bisogno!
Selvin,

5

L'aggiunta di un carattere jolly alla fine di una directory ls impone percorsi completi. In questo momento hai questo:

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

Invece potresti farlo:

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

Sfortunatamente questo non stampa il percorso completo delle directory ricorsive, quindi potrebbe non essere la soluzione completa che stai cercando.


Inoltre, sfortunatamente, non è possibile eseguirne il superamento con un carattere jolly (poiché il carattere jolly viene espanso come utente normale).
Andrew Lorien

4

Molte risposte che vedo. Questo è mio e penso che sia molto utile se stai lavorando su Mac.

Sono sicuro che sai che ci sono alcuni file "bundle" ( .app , .rtfd , .workflow e così via). E guardando la finestra di Finder sembrano file singoli. Ma non lo sono. E $ lso $ findvederli come directory ... Quindi, a meno che tu non abbia bisogno di elencare anche i loro contenuti, questo funziona per me:

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

Naturalmente questo è per la directory di lavoro e potresti aggiungere altre estensioni di bundle (ma sempre con un /dopo di esse). O qualsiasi altra estensione se non bundle senza/ .

Piuttosto interessante il " .lpdf/" (pdf multilingue). Ha .pdfun'estensione " " normale (!!) o nessuna nel Finder. In questo modo ottieni (o conta solo 1 file) per questo pdfe non un sacco di cose ...


4

ls -lR è quello che stavi cercando, o almeno lo ero. Saluti


OP vuole solo il percorso completo e nient'altro. ls -lRnon raggiungerebbe questo obiettivo.
Hadrien TOMA

3

Se la directory viene passata come percorso relativo e sarà necessario convertirla in un percorso assoluto prima di chiamare find. Nel seguente esempio, la directory viene passata come primo parametro allo script:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

Se il tuo sistema è in readlinkgrado di farlodirectory=$(readlink -e $1)
In pausa fino a ulteriore avviso.

Vero, ma la combinazione cd / pwd funzionerà su tutti i sistemi. readlinksu OS X 10.5.8 non supporta l'opzione -e.
John Keyes,

3
tar cf - $PWD|tar tvf -             

È lento ma funziona in modo ricorsivo e stampa sia directory che file. Puoi pipe con awk / grep se vuoi solo i nomi dei file senza tutte le altre informazioni / directory:

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

2
puoi anche usare semplicemente: tar cvf / dev / null $ PWD
Regola B

2

@ ghostdog74: piccola modifica con la tua soluzione.
Il seguente codice può essere utilizzato per cercare il file con il suo percorso assoluto completo.

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]

1

Conoscevo il nome del file ma volevo anche la directory.

trova $ PWD | nomefile fgrep

ha funzionato perfettamente in Mac OS 10.12.1

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.