Algo parecido com o seguinte é o que eu estou procurando, mas meu código não funciona, não importa como eu escape {}
e+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Depois de ver essa pergunta sobre o Unix - e - Linux , descobri que o código a seguir funciona, mas não está aninhando o achado como tal, e suspeito que haja uma maneira melhor de realizar esse trabalho específico.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
Existe alguma maneira de aninhar find -exec
sem a necessidade de chamar uma concha (como acima), com todas as suas citações esquisitas e restrições de escape?
Ou isso pode ser feito diretamente em um único comando find, usando uma mistura de seus muitos parâmetros?
text-processing
find
filenames
Peter.O
fonte
fonte
find
, mas sefind
não pode fazer isso, por que éfind
tão reverenciado (?) Como a ferramenta? usar para encontrar arquivos? ... Eu descobri subseqüentemente quefind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
funciona bem na minha situação (a referência de jw013-prune
me levou a isso na página de manual), mas me pergunto se é um método robusto (em gêneros). Eu realmente nunca useifind
(em menos de um ano de Linux) comolocate
fiz quase tudo o que preciso, por isso é um território desconhecido.-path
teste é exatamente o que eu ia sugerir. Com isso, você deve ser capaz de fazer tudo o que você quer (não para o Ace Of Base de associação;))Respostas:
Eu tentaria usar uma única descoberta como:
ou mesmo (não
find
, apenas globbing shell)embora isso não tenha a
-type f
verificação, isso só funciona se você não tiver diretórios / arquivos que não terminem em.ini
. Se você poderia usaro que, no entanto, perderia a vantagem de precisar apenas de uma chamada md5sum.
Editar
Para um método geral e seguro de encadeamento
find
, você pode fazer algo comofonte
-f
, e, em seguida, outro erro com (f?)-execdir
.. Quando eu substituir -execdir com -exec, e / ou também substituindo md5sum com impressão, recebo nada ..find
... Não é tanto que eu apenas queira que este exemplo seja resolvido, estou procurando informações sobre as maneiras de encontrar-fu .. Talvez haja mais penugem do que fu na busca .. (eu não sei, porque eu praticamente nunca a usei), e esta é a primeira situação em que eu realmente queria usá-la (na verdade, para arquivos de imagem) e o O recurso -exec que eu ouvi muito parece não ser tão poderoso quanto seu representante (?) alude a ... (+1 para as alternativas, no entanto) .. mas seufind
exemplo simplesmente não funciona (ainda )find
comando: ...find: The relative path
~ / bin 'está incluído na variável de ambiente PATH, que é insegura em combinação com a ação -execdir de find. Por favor, remova essa entrada de $ PATH` .... Então, talvez funcione, mas devo dizer que venho tentando me livrar dessa ~ / bin há algum tempo ... agora vou precisar olhar sério para isso ... não sei onde o coloquei ... alguma idéia de onde possa estar à espreita; o~/bin
em meu CAMINHOfind
é melhor apreciado em situações que não podem ser feitas inteiramente com globs, mas como esse tipo de situação é raro, normalmente não preciso encontrar muito.Seu problema original não exige que a chamada seja encontrada recursivamente, mas suponho que não era esse o ponto.
Eu acredito que não é possível chamar find recursivamente da maneira que você deseja.
O seguinte não está chamando find recursivamente (ou aninhando, como é chamado), mas você não pode simplesmente pegar um conjunto de resultados da primeira localização e alimentá-lo com a segunda? É assim que eu instintivamente faria:
Você também pode usar
xargs
para executar a segunda localização.Atualizar:
Eu gostaria de acrescentar que, como a maioria dos utilitários UNIX usa vários argumentos de nome de arquivo em vez de um, você geralmente pode evitar o seguinte
-exec
:Ao aninhar backticks, basta adicionar barras invertidas
\
antes das internas.Se imaginarmos que
md5sum
leva apenas um argumento de nome de arquivo, sempre podemos envolvê-lo em umfor
loop:Observe que isso se torna mais difícil se houver nomes de arquivos / diretórios iniciados
-
ou contendo um espaço. Os utilitários UNIX não funcionam bem com eles. Nesse caso./
,--
é necessário adicionar ou citar.Obviamente, o exemplo original não é bom, porque poderíamos fazer:
fonte
find
métodos mostrados recebem um erro quando um arquivo / diretório contém espaços ...md5sum .*/*.ini
Funciona bem ... Estou começando a ter a sensação geral de que * Warren Young * comentar sobre as coisas que ficam 'complexas'find
acontece no início do jogo :), mas eu suponho que isso ocorrafind
quando os testes de condição forem mais complexos, mas no que diz respeito ao aninhamento -exec, deixei a ideia de lado, como parece existem maneiras mais simples de fazer isso .. (mas perl não é "simples" para mim (ainda) ...Pelo menos eu consegui aninhar 2 comandos find:
Mas não resolvi invocar outra chamada -exec (dir) - a partir daí.
fonte