Vamos dizer que eu estou em um diretório que tem alguns subdiretórios, dir1
, dir2
, e dir3
. Cada um desses diretórios possui um arquivo foo
e eu gostaria de executar o mesmo comando em cada foo
um dos diretórios e executar esse comando de dentro desse diretório.
Se eu o fizesse "manualmente", seria algo como isto:
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
É imperativo que o comando seja executado em cada um dos diretórios . foo
é um script de agendamento em lote (para HTCondor, se você quiser saber) e deve ser executado em cada subdiretório para que a saída das execuções iniciadas pelos scripts de agendamento termine em cada subdiretório.
A pergunta " Encontre um arquivo e execute um comando no diretório do arquivo ", até onde sei, não responde à minha pergunta. A primeira resposta a essa pergunta é mais uma solução alternativa que não funcionará no meu caso, e a segunda resposta não tem explicação suficiente para que eu saiba como usá-la.
Respostas:
Supondo que você o
find
suporte, use a-execdir
opção em vez de-exec
Caso contrário, forneça detalhes da sua plataforma e / ou distribuição (conforme apropriado).
fonte
{}
, mas é o pai{}
.-exec
, mas o comando especificado é executado no subdiretório que contém o arquivo correspondente ".Supondo que você saiba exatamente em quais diretórios executar seu comando,
ou, repetindo os
foo
arquivos,O subshell impede
cd
que isso afete o diretório de trabalho do restante do script. A${foo%/*}
substituição de parâmetro se expande para o nome do diretório em que ofoo
arquivo está (removendo tudo após o último/
no valor de$foo
).Usando o padrão
find
para fazer a mesma coisa (no caso em que osfoo
arquivos podem estar no fundo de uma estrutura de diretórios):Em palavras: encontre todos os arquivos regulares chamados "foo" em qualquer lugar do diretório atual ou abaixo e atribua seus nomes de caminho para esse script de shell em lotes. O script de shell deve percorrer os nomes de caminho fornecidos, alterar o diretório para a parte do diretório de cada nome de caminho e, se for bem-sucedido, executar
somecommand foo
.Para uma solução que usa fora do padrão
-execdir
, consulte a resposta da roaima . Sua resposta se adaptou ao meu exemplo:fonte