Como se pode gerar uma lista de arquivos com o seu caminho absoluto no Linux?
-
05-07-2019 - |
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?
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}'