Elenca i file in modo ricorsivo nell'interfaccia della riga di comando di Linux con il percorso relativo alla directory corrente


224

Questo è simile a questa domanda , ma voglio includere il percorso relativo alla directory corrente in unix. Se faccio quanto segue:

ls -LR | grep .txt

Non include i percorsi completi. Ad esempio, ho la seguente struttura di directory:

test1/file.txt
test2/file1.txt
test2/file2.txt

Il codice sopra restituirà:

file.txt
file1.txt
file2.txt

Come posso ottenerlo per includere i percorsi relativi alla directory corrente usando i comandi Unix standard?


4
Questo dimostra solo che manca questa funzione.
Arjun Singri,

1
È un peccato che tutte queste soluzioni richiedano findo tree. Sto cercando un dispositivo Android in cui mi sembra di avere solo ls, e nessuno di questi altri strumenti: /
Ponkadoodle,

Risposte:


304

Usa trova:

find . -name \*.txt -print

Sui sistemi che usano GNU find, come la maggior parte delle distribuzioni GNU / Linux, puoi tralasciare l'impronta.


11
... e del resto puoi tralasciare il '.'
Adam Mitz,

7
Per percorsi assoluti, utilizzarefind $(pwd) -name \*.txt
Zags,

2
Se il modello ha parte del nome della directory, utilizzare -path "*docs/*.txt"invece di -name. -wholenameè uguale a-path
precipitosamente il

9
Utilizzare -type fper restituire solo file e non directory, collegamenti simbolici, ecc.
utente

2
-name "*.txt"sarà NON corrispondere file.TXT- utilizzare sempre -iname "*.txt", invece, che è maiuscole e minuscole.
ccpizza,

73

Utilizzare tree, con -f(percorso completo) e -i(nessuna riga di rientro):

tree -if --noreport .
tree -if --noreport directory/

È quindi possibile utilizzare grepper filtrare quelli desiderati.


Se il comando non viene trovato, è possibile installarlo:

Digitare il comando seguente per installare il comando ad albero su RHEL / CentOS e Fedora linux:

# yum install tree -y

Se stai usando Debian / Ubuntu, Mint Linux digita il seguente comando nel tuo terminale:

$ sudo apt-get install tree -y

2
qualche impostazione per elencare solo i file ed escludere le cartelle?
thebugfinder il

25

Prova find. Puoi cercarlo esattamente nella pagina man, ma è in questo modo:

find [start directory] -name [what to find]

quindi per il tuo esempio

find . -name "*.txt"

dovrebbe darti quello che vuoi.



5

Questo è il trucco:

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

Ma lo fa "peccando" con l'analisi di ls, tuttavia, che è considerata una cattiva forma dalle comunità GNU e Ghostscript.


2
@CAFEBABE: è considerato un tabù analizzare i risultati lsperché generalmente porta a bug. La frase in questione stava cercando di evocarlo. C'era anche uno scherzo che ho rimosso.
Adam Katz,

4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

'sed' cancellerà 'your_path' da tutti i risultati 'find'. E ricevi relativamente al percorso 'DIR'.


questo è esattamente ciò di cui ho bisogno ma mi sputa ancora per intero?
v3nt

1
non usare l'apostrofo - find / tmp | sed s: "/ tmp" :: | altro
Kieren Dixon

4

Per ottenere i nomi dei file del percorso completo effettivi dei file desiderati utilizzando il comando find, utilizzalo con il comando pwd:

find $(pwd) -name \*.txt -print

1

Ecco uno script Perl:

sub format_lines($)
{
    my $refonlines = shift;
    my @lines = @{$refonlines};
    my $tmppath = "-";

    foreach (@lines)
    {
        next if ($_ =~ /^\s+/);
        if ($_ =~ /(^\w+(\/\w*)*):/)
        {
            $tmppath = $1 if defined $1;    
            next;
        }
        print "$tmppath/$_";
    }
}

sub main()
{
        my @lines = ();

    while (<>) 
    {
        push (@lines, $_);
    }
    format_lines(\@lines);
}

main();

utilizzo:

ls -LR | perl format_ls-LR.pl

Questo è un programma Perl terribile. Probabilmente è 2-3 volte più lungo e complicato di quanto debba essere.
Brad Gilbert,

1

È possibile creare una funzione shell, ad es. Nel proprio .zshrco .bashrc:

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

Il primo avrebbe funzionato solo su singoli file, ovviamente.


1

Trova il file chiamato "nome file" sul tuo filesystem avviando la ricerca dalla directory principale "/". Il "nome file"

find / -name "filename" 

1

Se si desidera preservare i dettagli forniti con ls come dimensione del file ecc. Nell'output, questo dovrebbe funzionare.

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

1

Nella shell di pesce , puoi farlo per elencare tutti i pdf in modo ricorsivo, inclusi quelli nella directory corrente:

$ ls **pdf

Rimuovi 'pdf' se vuoi file di qualsiasi tipo.


0

È possibile implementare questa funzionalità in questo modo
In primo luogo, utilizzando il comando ls puntato alla directory di destinazione. Successivamente, utilizzando il comando find, filtrare il risultato da esso. Dal tuo caso, sembra: sempre il nome del file inizia con una parola file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)

0

In mycase, con comando ad albero

Percorso relativo

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file
done

Percorso assoluto

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
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.