Domanda

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

Per questo motivo, devo 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 forniscono 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 nella shell compresi i loro percorsi assoluti?

È stato utile?

Soluzione

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

find "$(pwd)" -name .htaccess

o se la tua shell espande $ PWD nella directory corrente:

find "$PWD" -name .htaccess

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

Greg Hewgill ha anche suggerito di utilizzare pwd -P se si desidera risolvere i collegamenti simbolici nella tua directory corrente.

Altri suggerimenti

readlink -f filename 

fornisce il percorso assoluto completo. ma se il file è un collegamento simbolico, otterrai il nome risolto finale.

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

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

questo per file e directory direttamente nella 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 si abilita 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 la stampa di file, puoi anche aggiungere l'opzione -ty f per cercare solo i file normali. Altre opzioni sono " d " solo per directory ecc. Quindi nel tuo caso lo sarebbe (se voglio cercare solo 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 sopra, perché $ PWD viene completato automaticamente nella directory home quando l'alias viene impostato da bash.

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

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

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

Dovresti ottenere:

/home/ken/foo/bar

Pertanto, se si desidera un ls -l e si deve restituire il percorso assoluto, si può semplicemente dire al comando find di eseguire un ls -l su qualunque esso trova.

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

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

Otterrai qualcosa del genere:

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

Se non si è sicuri della posizione del file, è sempre possibile modificare il percorso di ricerca. Finché il percorso di ricerca inizia con " / " ;, otterrai in cambio un percorso assoluto. Se stai cercando una posizione (come /) in cui otterrai molti errori di autorizzazione negata, ti consiglio di reindirizzare l'errore standard in modo da poter effettivamente vedere i risultati della ricerca:

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

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

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

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

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

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

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

trova / -print lo farà

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top