comando ls: come posso ottenere un ricorsiva percorso completo messa in vendita, una riga per ogni file?

StackOverflow https://stackoverflow.com/questions/1767384

  •  21-09-2019
  •  | 
  •  

Domanda

Come posso ottenere ls per sputare fuori una semplice lista di percorsi ricorsive uno-per-line?

Per esempio, voglio solo una lista piatta 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 quasi fa quello che mi serve, ma io non voglio frammenti di percorso, voglio percorsi completi.

È stato utile?

Soluzione

Se davvero si vuole utilizzare ls, quindi formattare la sua uscita utilizzando awk:

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

Altri suggerimenti

Usa trovare:

find .
find /home/dreftymac

Se si desidera solo i file (omettere le directory, dispositivi, ecc):

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

ls -ld $(find .)

se si desidera ordinare l'output per data di modifica:

ls -ltd $(find .)

Prova il seguente modo più semplice:

find "$PWD"

Best comando è: tree -fi

Per poter utilizzare i file ma non i collegamenti, è necessario rimuovere > dalla tua uscita:

tree -fi |grep -v \>

Se si vuole conoscere la natura di ogni 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

Oh, davvero una lunga lista di risposte. Mi ha aiutato molto e alla fine, ho creato la mia, che ero alla ricerca di:

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

find "$PWD" -type f

Per elencare tutti i Directory in una directory e delle sue sottodirectory:

find "$PWD" -type d

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

find "$PWD"

Non so circa il percorso completo, ma è possibile utilizzare -R per la ricorsione. In alternativa, se non sei intenzionato a ls, si può solo fare find *.

Utilizzando nessun comando esterni diversi ls:

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

du -a

Handy per alcune conchiglie appliance limitati in cui find / individuano non sono disponibili.

find / farà il trucco

Credo che per una semplice lista il modo migliore è:

find -D tree /fullpath/to-dir/ 

(o al fine di salvare in un file txt)

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

Non rendono complicato. Ho appena usato questo e ottenuto una bella uscita:

ls -lR /path/I/need

Il modo più semplice per tutti voi gente del futuro è semplicemente:

du

Questo, tuttavia, mostra anche la dimensione di che cosa è contenuto in ciascuna cartella È possibile utilizzare awk per produrre solo il nome della cartella:

du | awk '{print $2}'

Modifica- scusa scusa, il mio male. Ho pensato che fosse solo le cartelle che sono stati necessari. Ill lasciare questo qui nel caso qualcuno in futuro ne ha bisogno in ogni modo ...

Con avere la libertà di utilizzare tutte le possibili opzioni BS:

find -type f | xargs ls -1

Eseguire un comando bash con il seguente formato:

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

Ecco una risposta parziale che mostra i nomi delle directory.

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

Spiegazione:

ls -mR * sono elencati i nomi delle directory completo che terminano in un ':', poi elenca i file nella directory separatamente

sed -n 's/://p' trova righe che terminano in due punti, togliere i due punti e stampare la riga

Con l'iterazione sulla lista di directory, dovremmo essere in grado di trovare le directory pure. Ancora workin su di esso. E 'una sfida per ottenere i caratteri jolly attraverso xargs.

L'aggiunta di un jolly per la fine di una directory ls forze percorsi completi. In questo momento si dispone di questo:

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

Si potrebbe fare questo, invece:

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

Purtroppo questo non stampa il percorso completo per le directory ricorsivo in, in modo che non può essere la soluzione completa che stai cercando.

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

Un sacco di risposte che vedo. Questo è mio, e credo che molto utile se si sta lavorando su Mac.

Sono sicuro che sai che ci sono alcuni file "pacco" ( .app , .rtfd , .workflow , e così via ). E guardando la finestra del Finder sembrano singoli file. Ma non lo sono. E $ ls o $ find li vedono come directory ... Quindi, a meno che non hai bisogno di elencare i loro contenuti così, questo funziona per me:

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

Naturalmente questo è per la directory di lavoro, e si potrebbe aggiungere estensioni di altri bundle (ma sempre con un / dopo di loro). O qualsiasi altre estensioni se non impacchettano di senza il /.

Piuttosto interessante il ".lpdf/" (pdf multilingue). Ha normale estensione ".pdf" (!!) o nessuno nel Finder. In questo modo si ottiene (o semplicemente conta 1 file) per questa pdf e non un mucchio di roba ...

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

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
tar cf - $PWD|tar tvf -             

Questa è lento ma funziona in modo ricorsivo e stampa entrambe le directory e file. È possibile reindirizzare con awk / grep se si desidera solo i nomi dei file, senza tutte le informazioni Altre / directory:

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

@ ghostdog74: Piccolo trucco con la soluzione.
A seguito di codice può essere utilizzato per file di ricerca con la sua piena percorso assoluto.

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]

Lo sapevo il nome del file, ma volevo la directory pure.

trova $ PWD | fgrep filename

ha funzionato perfettamente in Mac OS 10.12.1

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top