Se eu entendi corretamente o que você quer fazer, esta é a solução:
#!/bin/sh
USAGE="Usage: $0 dir file1 file2 ... fileN\nto find all subdirectories of dir that contain all the given files.\n"
if [ "$#" == "0" ]; then
printf "$USAGE"
exit 1
fi
ARG=""
DIR=$1
shift
while (( "$#" )); do
ARG="$ARG -exec test -e \"{}/$1\" \; "
shift
done
cmd="find $DIR -type d $ARG -print"
eval $cmd
O que isso faz é isso:
O uso find ... -type d
para localizar todos os subdiretórios (incluindo o diretório fornecido como primeiro parâmetro).
O comando test -e
verifica se existe um arquivo. Portanto, para um determinado diretório, temos que verificar todos os arquivos fornecidos na linha de comando:
teste -e / path / to / directory / file1
teste -e / path / to / directory / file2
teste -e / path / to / directory / file3
...
O /path/to/directory
é {}
- um único resultado de find. Em seguida, o parâmetro de localização -exec
pode ser usado para verificar um único arquivo. Para verificar todos os arquivos, vários parâmetros -exec test
são necessários. Portanto, embora o loop crie uma lista de parâmetros, a lista é reunida em um único comando e avaliada.
Divirta-se ...