Encontre a primeira correspondência em cada ramificação de pastas, respectivamente

3

Considerando o seguinte layout de pasta:

Current_folder
└── FolderA
|   └── CMakeList.txt
|   └── FolderAA
|       └── CMakeList.txt
|
└── FolderB
|   └── FolderBA
|   |   └── CMakeList.txt
|   |   └── FolderBAA
|   |       └── CMakeList.txt
|   |
|   └── FolderBB
|       └── CMakeList.txt
|
└── FolderC
    └── CMakeList.txt
    └── FolderCA
        └── CMakeList.txt

Como posso usar find (ou qualquer outra ferramenta) para produzir uma saída semelhante a:

Current_folder/FolderA/CMakeList.txt
Current_folder/FolderB/FolderBA/CMakeList.txt
Current_folder/FolderB/FolderBB/CMakeList.txt
Current_folder/FolderC/CMakeList.txt

Isso significa que a pesquisa é interrompida após uma correspondência com o literal "CMakeLists.txt" para cada ramificação de pasta recursiva, respectivamente.

    
por Tano 07.03.2018 / 17:27

4 respostas

0

O que funcionou para mim foi o seguinte script:

#!/bin/bash
file_of_interest="CMakeList.txt"
latest_directory_wih_match=""

for current_directory in $(find -type d);
do
  if [[ (${latest_directory_wih_match} == "") || (! ${current_directory} == ${latest_directory_wih_match}*) ]];
  then
    if [ -f ${current_directory}/${file_of_interest} ]
    then
      latest_directory_wih_match=${current_directory}
      echo ${latest_directory_wih_match}/${file_of_interest}
    fi
  fi;
done

@ resposta da sobremesa funcionou para o exemplo mínimo acima também. Usá-lo na minha estrutura de pastas real (~ 4000 pastas) ainda estava dando resultados errados. Eu não tenho certeza porque, para ser honesto.

Quando eu tentei a solução do @ muru, ela não parou de ser executada. Eu acho que a função chamando em si não está abortando corretamente? Não tenho certeza sobre o motivo aqui também.

PS: Em um Projeto CMake real, o arquivo é chamado de "CMakeLists.txt" (observe os extras no final). Vi esse erro apenas depois que as respostas já foram fornecidas.

    
por Tano 08.03.2018 / 14:48
1

Você faria algo assim:

for path in ./*;do find "$path" -type f -name "CMakeList.txt" -print -quit ;done
./FolderA/CMakeList.txt
./FolderB/FolderBB/CMakeList.txt
./FolderC/CMakeList.txt

Isso imprimirá o caminho do arquivo e -quit assim que o primeiro arquivo com o nome correspondente encontrado em cada caminho passar para find "$path" .

    
por αғsнιη 07.03.2018 / 17:57
1

Uma função de shell (não testada):

search () (
  if [ -f ""/CMakeList.txt ]
  then
    # if you get a file, print and stop recursing
    echo "${1%/}/CMakeList.txt"
    return
  fi
  for d in ""/*/
  do
    # nothing found in this directory, recurse to subdirectories
    search "${d%/}"
  done
)
search .
    
por muru 07.03.2018 / 17:49