risposta-alla-domanda-sullo-sviluppo-web-bd.com

Vieni a giocare un elenco di file con il loro percorso assoluto in Linux?

Sto scrivendo uno script di Shell che accetta percorsi di file come input.

Per questo motivo, ho bisogno di generare elenchi di file ricorsivi con percorsi completi. Ad esempio, il file bar ha il percorso:

/home/ken/foo/bar

ma, per quanto posso vedere, sia ls che find danno solo elenchi di percorsi relativi:

./foo/bar   (from the folder ken)

Sembra un requisito ovvio, ma non riesco a vedere nulla nelle pagine man find o ls.

Come posso generare un elenco di file in Shell compresi i loro percorsi assoluti?

244
Ken

Se dai a find un percorso assoluto per iniziare, stamperà i percorsi assoluti. Ad esempio, per trovare tutti i file .htaccess nella directory corrente:

find "$(pwd)" -name .htaccess

o se la Shell espande $PWD nella directory corrente:

find "$PWD" -name .htaccess

find semplicemente antepone il percorso che è stato dato a un percorso relativo al file da quel percorso.

Greg Hewgill ha anche suggerito di usare pwd -P se vuoi risolvere i link simbolici nella tua directory corrente.

246
Matthew Scharley
readlink -f filename 

dà il percorso assoluto completo. ma se il file è un link simbolico, otterrà il nome finale risolto.

179
balki

Usalo per dirs (il / dopo ** è necessario in bash per limitarlo alle directory):

ls -d -1 "$PWD/"**/

questo per file e directory direttamente sotto la directory corrente, i cui nomi contengono un .:

ls -d -1 "$PWD/"*.*

questo per tutto:

ls -d -1 "$PWD/"**/*

Tratto da qui http://www.zsh.org/mla/users/2002/msg00033.html

In bash, ** è ricorsivo se abiliti shopt -s globstar.

101
user431529

Puoi usare

find $PWD 

in bash

24
Vinko Vrsalovic
ls -d "$PWD/"*

Questo appare solo nella directory corrente . Cita "$ PWD" nel caso contenga spazi.

13
didi

Il $PWD è una buona opzione di Matthew sopra. Se vuoi trovare solo i file di stampa, puoi anche aggiungere l'opzione -type f per cercare solo i file normali. Altre opzioni sono "d" solo per le directory ecc. Quindi nel tuo caso sarebbe (se voglio cercare solo i file con .c ext):

find $PWD -type f -name "*.c" 

o se vuoi tutti i file:

find $PWD -type f

Nota: non è possibile creare un alias per il comando precedente, perché $ PWD viene completato automaticamente nella directory home quando l'alias viene impostato da bash.

5
Gurpreet

Se dai il comando find un percorso assoluto, sputerà i risultati con un percorso assoluto. Quindi, dalla directory di Ken, se dovessi digitare:

find /home/ken/foo/ -name bar -print    

(invece del percorso relativo find . -name bar -print)

Dovresti ricevere:

/home/ken/foo/bar

Pertanto, se si desidera un ls -l e si deve restituire il percorso assoluto, è sufficiente indicare al comando find di eseguire un ls -l su qualunque cosa trovi.

find /home/ken/foo -name bar -exec ls -l {} ;\ 

NOTA: c'è uno spazio tra {} e ;

Otterrai qualcosa di simile a questo:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

Se non sei sicuro di dove si trova il file, puoi sempre modificare il percorso di ricerca. Finché il percorso di ricerca inizia con "/", riceverai un percorso assoluto in cambio. Se stai cercando una posizione (come /) in cui ottieni molti errori di autorizzazione negati, ti consiglio di reindirizzare l'errore standard in modo da poter effettivamente visualizzare i risultati della ricerca:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

(2> è la sintassi per le shell Borne e Bash, ma non funzionerà con la shell C. Potrebbe funzionare anche in altre shell, ma so solo per certo che funziona in Bourne e Bash).

4
Trudius

Comando: ls -1 -d "$PWD/"*

Questo darà i percorsi assoluti del file come di seguito.

[[email protected] ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
3
GSMurthy

Ecco un esempio che stampa un elenco senza un periodo aggiuntivo e che mostra anche come cercare una corrispondenza di file. Spero che questo ti aiuti:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
1
Mike Behr
lspwd() { for i in [email protected]; do ls -d -1 $PWD/$i; done }
1
rwilhelm