Pergunta

Eu estou escrevendo um script shell que leva caminhos de arquivo como entrada.

Por esta razão, eu preciso gerar listas de arquivos recursiva com caminhos completos. Por exemplo, o bar arquivo tem o caminho:

/home/ken/foo/bar

mas, tanto quanto eu posso ver, tanto ls e find só dão listagens de caminho relativa:

./foo/bar   (from the folder ken)

Parece que uma exigência óbvia, mas eu não posso ver nada nos find ou ls páginas do manual.

Como posso gerar uma lista de arquivos no shell incluindo seus caminhos absolutos?

Foi útil?

Solução

Se você der find um caminho absoluto para começar, ele irá imprimir caminhos absolutos. Por exemplo, para encontrar todos os arquivos .htaccess no diretório atual:

find "$(pwd)" -name .htaccess

ou se seus expande shell $PWD para o diretório atual:

find "$PWD" -name .htaccess

find simplesmente anexa o caminho que foi dado a um caminho relativo para o arquivo a partir desse caminho.

Greg Hewgill também sugeriu o uso pwd -P se você quiser links simbólicos resolver no seu diretório atual.

Outras dicas

readlink -f filename 

dá o caminho absoluto completo. mas se o arquivo é um link simbólico, o retorno vai obter o nome resolvido final.

Use isso para dirs (a / após ** é necessária em bash para limitá-lo aos diretórios):

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

este para arquivos e diretórios diretamente sob o diretório atual, cujos nomes contêm uma .:

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

este para tudo:

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

Tomado daqui http://www.zsh.org/mla/users/2002/msg00033.html

Em bash, ** é recursiva se você habilitar shopt -s globstar.

Você pode usar

find $PWD 

em bash

ls -d "$PWD/"*

Somente este olha no atual diretório. Ele cita "$ PWD" no caso de ele contém espaços.

O $PWD é uma boa opção por Matthew acima. Se você quiser encontrar para imprimir apenas os arquivos, então você também pode adicionar o -type f opção para pesquisar apenas arquivos normais. Outras opções são "d" para diretórios única etc. Assim, no seu caso, seria (se eu quiser procurar apenas para arquivos com ext .c):

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

ou se você quiser todos os arquivos:

find $PWD -type f

Nota: Você não pode fazer um alias para o comando acima, porque $ PWD fica auto-preenchido para seu diretório home quando o alias está sendo definido pelo bash.

Se você der o comando find um caminho absoluto, ele vai cuspir os resultados com um caminho absoluto. Então, a partir do diretório Ken se você tivesse que digitar:

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

(em vez do find . -name bar -print caminho relativo)

Você deve obter:

/home/ken/foo/bar

Portanto, se você quer um ls -l e tê-lo retornar o caminho absoluto, você pode simplesmente dizer o comando find para executar um ls -l em tudo o que encontra.

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

NOTA: Existe um espaço entre {} e ;

Você vai obter algo como isto:

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

Se você não tem certeza onde está o arquivo, você sempre pode mudar o local da pesquisa. Enquanto o caminho de pesquisa começa com "/", você vai ter um caminho absoluto em troca. Se você está procurando um local (como o /), onde você está indo para obter um monte de erros de permissão negada, então eu recomendo redirecionando erro padrão para que você possa realmente ver os resultados da procura:

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

(2> é a sintaxe para as conchas Borne e Bash, mas não vai funcionar com o shell C. Ele pode funcionar em outras conchas também, mas eu só sei com certeza que ele funciona em Bourne e Bash).

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

Isto vai dar os caminhos absolutos de arquivo como abaixo.

[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 }

Aqui está um exemplo que imprime uma lista sem um período extra e que também demonstra como procurar uma correspondência arquivo. Espero que isso ajude:

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

find / -print vai fazer isso

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top