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?
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.
readlink -f filename
dà il percorso assoluto completo. ma se il file è un link simbolico, otterrà il nome finale risolto.
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
.
Puoi usare
find $PWD
in bash
ls -d "$PWD/"*
Questo appare solo nella directory corrente . Cita "$ PWD" nel caso contenga spazi.
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.
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).
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
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|\./||"
lspwd() { for i in [email protected]; do ls -d -1 $PWD/$i; done }