Estou escrevendo um script de shell que usa caminhos de arquivo como entrada.
Por esse motivo, preciso gerar listagens de arquivos recursivos com caminhos completos. Por exemplo, o arquivo bar
tem o caminho:
/home/ken/foo/bar
mas, tanto quanto eu posso ver, tanto ls
e find
só dão listagens de caminho relativo:
./foo/bar (from the folder ken)
Parece que uma exigência óbvia, mas eu não posso ver nada nos find
ou ls
homem páginas.
Como posso gerar uma lista de arquivos no shell, incluindo seus caminhos absolutos?
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Respostas:
Se você der
find
um caminho absoluto para começar, ele imprimirá caminhos absolutos. Por exemplo, para encontrar todos os arquivos .htaccess no diretório atual:ou se o seu shell se expandir
$PWD
para o diretório atual:find
simplesmente acrescenta o caminho que foi dado a um caminho relativo para o arquivo desse caminho.Greg Hewgill também sugeriu o uso
pwd -P
se você quiser resolver links simbólicos no diretório atual.fonte
pwd -P
.ls -d -1 $PWD/**/*
mas eu acho quefind $PWD
também funciona (testado em bash)find $PWD
é simples. Ols
encantamento é complexo e pesado (a menos que você o atinja).find
não depende de expansões glob do shell, portanto funcionará em qualquer shell.find
também é muito mais flexível, posso obter uma lista recursiva de todos os arquivos, ou talvez de todos os diretórios, ou talvez eu queira uma lista de todos os arquivos xml ou todos os arquivos alterados na última semana. Tudo isso é possível comfind
, mas não facilmente comls
.find "`pwd`" -name .htaccess
por causa de espaços em nomes de diretóriofornece o caminho absoluto completo. mas se o arquivo for um link simbólico, você obterá o nome final resolvido.
fonte
realpath
vezbrew install coreutils
, o executável será instalado como/usr/local/opt/coreutils/libexec/gnubin/readlink
Use isso para dirs (o
/
after**
é necessário no bash para limitá-lo aos diretórios):isso para arquivos e diretórios diretamente no diretório atual, cujos nomes contêm um
.
:isso para tudo:
Retirado daqui http://www.zsh.org/mla/users/2002/msg00033.html
Na festança,
**
é recursivo se você ativarshopt -s globstar
.fonte
Você pode usar
na festança
fonte
Isso parece apenas no diretório atual . Cita "$ PWD", caso contenha espaços.
fonte
Comando:
ls -1 -d "$PWD/"*
Isso fornecerá os caminhos absolutos do arquivo, como abaixo.
fonte
A
$PWD
é uma boa opção por Matthew acima. Se você deseja encontrar apenas arquivos de impressão, também pode adicionar a opção -type f para pesquisar apenas arquivos normais. Outras opções são "d" apenas para diretórios etc. Portanto, no seu caso, seria (se eu quiser procurar apenas arquivos com .c ext):ou se você quiser todos os arquivos:
Nota: Você não pode criar um alias para o comando acima, porque $ PWD é preenchido automaticamente no diretório inicial quando o alias está sendo definido pelo bash.
fonte
Se você der ao comando find um caminho absoluto, ele cuspirá os resultados com um caminho absoluto. Portanto, no diretório Ken, se você digitar:
(em vez do caminho relativo
find . -name bar -print
)Voce deveria pegar:
Portanto, se você deseja
ls -l
que ele retorne o caminho absoluto, basta dizer ao comando find para executar umls -l
no que encontrar.NOTA: Há um espaço entre
{}
e;
Você obterá algo como isto:
Se você não tiver certeza de onde está o arquivo, sempre poderá alterar o local da pesquisa. Desde que o caminho de pesquisa comece com "/", você receberá um caminho absoluto em troca. Se você estiver pesquisando um local (como /) no qual obterá muitos erros de permissão negada, recomendo redirecionar o erro padrão para que você possa realmente ver os resultados da pesquisa:
(
2>
é a sintaxe dos shells Borne e Bash, mas não funcionará com o shell C. Ele também pode funcionar em outros shells, mas só tenho certeza de que funciona em Bourne e Bash).fonte
ls
processo com-exec ls -ld {} +
. (Você provavelmente-d
não deseja ter ols
conteúdo do diretório da lista). Ou melhor, use o find's incorporadols
comfind ... name bar -ls
. Além disso, você tem a sintaxe errada para um argumento por comando: você precisa citar o ponto-e-vírgula do shell, por isso é{} \;
.fd
Usando
fd
(alternativa afind
), use a seguinte sintaxe:Onde
.
está o padrão de pesquisa efoo
o diretório raiz.Por exemplo, para listar todos os arquivos na
etc
forma recursiva, execute:fd . /etc -a
.fonte
Apenas uma alternativa para
para identificar que
*
é a expansão do shell, entãofaria o mesmo (a desvantagem que você não pode usar
-1
para separar por novas linhas, não por espaços).fonte
-1
para separar por linhas?fonte
Aqui está um exemplo que imprime uma lista sem um período extra e também demonstra como procurar uma correspondência de arquivo. Espero que isto ajude:
fonte
Isso funcionou para mim. Mas não listou em ordem alfabética.
Este comando lista alfabeticamente e também os arquivos ocultos.
fonte
stat
Caminho absoluto de um único arquivo:
fonte
Você pode tentar isso.
Você pode obter o caminho do abs usando
for
loop eecho
simplesmente semfind
.fonte
Se você precisar de uma lista de todos os arquivos nos diretórios atual e subdiretório
Se você precisar de uma lista de todos os arquivos apenas no diretório atual
fonte
Isso fornecerá o caminho canônico (resolverá os links simbólicos):
realpath FILENAME
Se você deseja um caminho canônico para o próprio link simbólico, então:
realpath -s FILENAME
fonte
A maioria, se não todos os métodos sugeridos, resultam em caminhos que não podem ser usados diretamente em algum outro comando do terminal se o caminho contiver espaços. Idealmente, os resultados terão barras pré-adicionadas. Isso funciona para mim no macOS:
fonte
find / -print
vai fazer issofonte
fonte