Listar recursivamente todos os arquivos e subdiretórios

15

Existe uma maneira, possivelmente usando um pacote, de listar recursivamente todos os arquivos (com caminhos) e subdiretórios (ou pelo menos os subdiretórios vazios , pois os caminhos para os não vazios podem ser recolhidos a partir dos caminhos de os arquivos nele contidos) do diretório atual?

O mais próximo que pude encontrar é a projectile-find-filefunção do projectilepacote (alternativamente, a helm-projectile-find-filefunção do helm-projectilepacote), mas não parece capaz de listar pastas vazias. Além disso, parece funcionar apenas com o Git e outros repositórios de controle de versão, mas pode haver uma solução alternativa para essa limitação.

Evan Aad
fonte
2
não sei muito bem o que você tenta fazer, mas [esta postagem do blog] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) pode conter o que você precisa, ou você pode tentar [este] (ergoemacs.org/emacs/elisp_traverse_dir.html) como iniciante.
Theldoria 06/06
O que você quer dizer com "lista"? Deseja funções do Emacs Lisp que retornam uma lista de strings com os caminhos? Você quer um buffer com os caminhos, digamos, um por linha? Deseja um buffer direcionado com todos os arquivos? (Essa última é fácil, adicione "-R" aos interruptores ls em dired.)
Omar
@ Omar: Eu tenho os requisitos ideais: (1) que seja parte do Emacs ou parte de um pacote, (2) que funcione com um helmou outro ivy, ou seja, que os resultados serão exibidos em um buffer helmou ivy. Se for impossível satisfazer os dois requisitos, o segundo é mais importante para mim.
precisa
11
São realmente duas perguntas diferentes. Mas tudo bem, eu forneci uma resposta para cada um.
Drew

Respostas:

8

Supondo que você use, ivyvocê pode usar esta função

    (defun fhd/counsel-everything ()
      "list everything recursively"
      (interactive)
      (let* ((cands (split-string
                     (shell-command-to-string "find .") "\n" t)))
        (ivy-read "File: " cands
                  :action #'find-file
                  :caller 'fhd/counsel-everything)))
fhdhsni
fonte
Obrigado. E se eu usar helm?
precisa
11
Desculpe, eu não sei helm. ivyé bem leve. Dê um tiro.
fhdhsni
13

diretório-arquivos-recursivamente

(Eu acho que isso foi adicionado no Emacs 25)

aqui está o link para o manual: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Retorne todos os arquivos no diretório cujos nomes correspondam a regexp. Essa função pesquisa no diretório especificado e em seus subdiretórios, recursivamente, arquivos cujos nomes de base (ou seja, sem os diretórios principais) correspondam ao regexp especificado e retorna uma lista dos nomes absolutos dos arquivos correspondentes (consulte nomes absolutos de arquivos) . Os nomes dos arquivos são retornados em ordem de profundidade, o que significa que os arquivos em algum subdiretório são retornados antes dos arquivos em seu diretório pai. Além disso, os arquivos correspondentes encontrados em cada subdiretório são classificados em ordem alfabética por seus nomes de base. Por padrão, os diretórios cujos nomes correspondem à regexp são omitidos da lista, mas se o argumento opcional include-folders for diferente de zero, eles serão incluídos.

Exemplo

(directory-files-recursively default-directory "")
wvxvw
fonte
Não encontrar diretórios vazios
fhdhsni
11
@fhdhsni fez você tente definir include-directoriesa t? Estou trabalhando no Emacs 24 e não posso tentar isso agora, mas posso testar isso em casa em poucas horas.
Wwxvw 6/06
Foi mal. Eu não fiz isso. Você pode incluí-lo em sua resposta.
Fhdhsni 06/06
4

Esta resposta assume que você deseja exibir uma lista dos nomes de arquivos e diretórios, em vez de obter uma lista Lisp deles.

Use comandos padrão Emacs find-dired, find-name-diredou find-grep-dired. Os nomes de arquivos e diretórios encontrados são exibidos em um buffer no modo Dired. (Você pode colocar todo o poder do Dired para trabalhar nos resultados.)

Se você usa a biblioteca, find-dired+.elentão possui versões aprimoradas desses comandos padrão do Emacs, além de possuir um comando find-time-dired, que encontra arquivos mais novos ou mais antigos que um determinado carimbo de data / hora.

Desenhou
fonte
find-diredé exatamente o que estou procurando, mas existe uma maneira de imprimir apenas nomes? Como, por outro lado, o nome do arquivo único requer várias linhas sem motivo, porque eu absolutamente não me importo com o tamanho, a data ou as permissões dos arquivos. Eu tentei executar (setcar find-ls-option "-printf '%p\n'")antes find-dired, mas por algum motivo, dessa maneira, o comando não deseja abrir um arquivo ao pressionar Enter sobre um item.
Hi-Angel
2
@ Hi-Angel: O buffer no qual os resultados são exibidos está no modo Dired. Assim, você pode pressionar / (alternar para exibir mais do que os nomes dos arquivos. Eu o deixo desligado a maior parte do tempo (nenhum detalhe é mostrado) e apenas o desligo brevemente quando quero verificar alguns detalhes.
Drew
1

Consulte https://github.com/technomancy/find-file-in-project

Existem comandos para localizar arquivos ou localizar diretórios. Mas não ambos.

Se você deseja apenas listar todos os subdiretórios e arquivos de forma recursiva em um buffer, há dois comandos criados no Emacs para idades:

  1. M-x find-dired. Depende da ferramenta CLI find. No Windows, você precisa instalar o Cygwin ou MYSYS, que possuifind

  2. M-x find-lisp-find-dired. O mesmo que find-diredescrito em Lisp. Portanto, não há dependência de terceiros. Além disso, ele pode reconhecer o local fora da caixa. Mas é mais lento quefind-dired

Chen Bin
fonte
Meu caso de uso seria o mesmo de qualquer pessoa que use o comando shell UNIX lsou a função Emacs find-file, que lista arquivos e diretórios, incluindo diretórios vazios.
Evan Aad
São recursivos find-direde find-lisp-find-diredlistam não apenas o conteúdo do diretório atual, mas também o conteúdo de cada um de seus subdiretórios, subdiretórios, etc.?
Evan Aad
Sim, recursivamente
chen bin
1

Esta resposta pressupõe que você deseja obter uma lista Lisp dos nomes de arquivos e diretórios, em vez de exibir uma lista deles.

Se você usar a biblioteca Dired + então você pode usar a função diredp-files-within. (Você não precisa estar em um buffer Dired para usá-lo.)

Isso funciona com qualquer versão do Emacs e é mais geral do que directory-files-recursively.

  • Você pode passar uma lista de arquivos e diretórios, e ela atua recursivamente em cada um deles.

  • Ou você pode passar uma função que retorna essa lista.

    • Se houver um buffer direcionado para um diretório que é processado, a função será chamada nesse buffer para retornar a lista de arquivos a serem incluídos.

      Por exemplo, se a função for dired-get-marked-files , apenas os arquivos e subdiretórios marcados serão incluídos.

  • Você pode transmitir um predicado que cada arquivo ou diretório deve satisfazer. A correspondência de regexp é, obviamente, um tipo de predicado.

  • Você pode dizer para não seguir os links simbólicos.

Desenhou
fonte
0
(defun my-dir-list (origem)
  ;;
  ;; Imprimir arquivos da lista no buffer atual
  ;;
  ;; Não testado, tipo de sistema: gnu
  ;; Testado, tipo sistema: windows-nt
  ;;
  (sDirectory interativo: ")
  (deixe ((n 0)
    (l-file-dir (e (cd source) (diretório-arquivos-e-atributos "./"))))
    (lista-dir '())
    (lista de arquivos '())
    )
    (princ (formato "% s \ n" diretório padrão) (buffer atual))
    (enquanto l-file-dir
      (if (enésimo 1 (dir-arquivo-l do carro))
      (setq n (1+ n)
        dir-list (contras ((lambda (origem))
                  (e (não (prefixo-de-string-p "." (fonte do carro))) fonte))
                (carro l-arquivo-dir)) lista de dir)
        )
    (princ (formato "% s \ n" (concat default-directory)
                      (e (correspondência de sequência "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar arquivo-l-dir)))) (buffer atual))
    )
      (setq arquivo-l-dir (cdr arquivo-l-dir))
      )
    (while (caar dir-list)
      (lista de diretórios setq (lista de diretórios cdr))
      (cd "..")
      )
    )
  'Está bem
  )
Joe
fonte