A solução óbvia seria alterar data.sh e aceitar um ou mais argumentos, sendo estes os arquivos (e talvez diretórios) sendo trabalhados.
Diga que o script contém atualmente:
#!/bin/bash
some-command ./* # ← this is where it works on all files
Você mudaria para:
#!/bin/bash
some-command "$@"
Aqui, $@ é todos os argumentos passados para data.sh e você só precisa chamá-lo assim:
/path/to/data.sh /path/to/another/directory/*
Em seguida, o script será executado em todos os arquivos no outro diretório. É claro que, sem saber exatamente o funcionamento interno de data.sh , é impossível sugerir como alterá-lo, especificamente.
Se você quiser manter data.sh como está, é necessário alterar o diretório atual sempre que o chamar. Isso fará com que seu script "pense" dentro de outro diretório.
Você pode conseguir isso usando cd (ou pushd / popd ) de um shell lançado por find :
find . -name "data.sh" -exec sh -c 'cd "$(dirname "$0")" && ./data.sh' {} \;
Ou você pode temporariamente cd o diretório em um subshell (são os parênteses em torno de cd ), talvez com globs, então você pode pular usando find (o ** corresponderá recursivamente a todos os diretórios): / p>
shopt -s globstar
for script in **/data.sh; do
( cd "$(dirname "$script")" && ./data.sh )
done
Se você não tivesse usado um subshell no comando acima, a segunda chamada cd falharia, pois tentaria cd do primeiro diretório encontrado que contivesse data.sh . Você pode evitar isso com pushd / popd :
for script in **/data.sh; do
pushd "$(dirname "$script")" && ./data.sh
popd
done