Elenca i file in modo ricorsivo nella CLI di Linux con percorso relativo alla directory corrente

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 ottenere che includa i percorsi relativi alla directory corrente usando i comandi Unix standard?

Usa trova:

 find . -name \*.txt -print 

Sui sistemi che usano GNU find, come la maggior parte delle distribuzioni GNU / Linux, puoi lasciare fuori l’impronta.

Usa tree , con -f (percorso completo) e -i (senza righe di indentazione):

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

È quindi ansible utilizzare grep per filtrare quelli che si desidera.


Se il comando non viene trovato, puoi installarlo:

Digitare il seguente comando per installare il comando tree 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 

Prova a find Puoi cercarlo esattamente nella pagina man, ma è qualcosa del genere:

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

quindi per il tuo esempio

find . -name "*.txt"

dovrebbe darti quello che vuoi

Potresti usare find invece:

 find . -name '*.txt' 

Questo fa 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 , che è considerata una ctriggers forma dalle comunità di GNU e Ghostscript.

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

‘sed’ cancellerà ‘your_path’ da tutti i risultati ‘find’. E ricevi relativo al percorso ‘DIR’.

Per ottenere i nomi dei file di percorso completi dei file desiderati utilizzando il comando find, utilizzarlo con il comando pwd:

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

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 

Potresti creare una funzione di shell, ad esempio in .zshrc o .bashrc :

 filepath() { echo $PWD/$1 } filepath2() { for i in [email protected]; do echo $PWD/$i done } 

Il primo funzionerebbe solo su singoli file, ovviamente.

Trova il file chiamato “nomefile” sul tuo filesystem avviando la ricerca dalla directory principale “/”. Il “nomefile”

 find / -name "filename" 

Se vuoi preservare i dettagli con ls come dimensione del file, ecc. Nel tuo output, allora dovrebbe funzionare.

 sed "s|||g" input_file > output_file 

È ansible implementare questa funzionalità in questo modo
In primo luogo, l’uso del comando ls puntava alla directory di destinazione. Più tardi, usando il comando find, filtrane il risultato. Dal tuo caso, sembra che – sempre il nome del file inizia con un file***.txt word file***.txt

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