Usando o shell, encontre todos os subdiretórios que contenham certos arquivos

2

Estou tentando usar o shell para encontrar todos os subdiretórios em qualquer diretório. O que eu quero é ter um arquivo .sh (arquivo de script de shell) que possa receber como parâmetro o nome do diretório em que estou interessado e a lista de arquivos que eu quero encontrar (NOTA: eu quero apenas subdiretórios que tem todos esses arquivos).

Eu sei que posso usar isso:

find $D -perm -u=rx -type f

Onde D é o diretório, -u é o usuário, r é o direito dos usuários de ler e x é o direito de modificar eu acredito, mas uhm não tenho idéia de como fazer o arquivo aceitar parâmetros e não tenho ideia como usar -u = rx

EDIT: Agora entendo como usar parâmetros para um arquivo de script de shell, então tudo bem. Eu ainda não recebo a maior parte do resto.

Eu adoraria se alguém pudesse explicar o código que mencionei ou ... dar uma alternativa?

Eu também estou bem com uma resposta parcial, eu só preciso de ajuda.

    
por Kalec 09.05.2012 / 14:02

2 respostas

1

Eu interpretaria seus requisitos como "localizar todos os subdiretórios que contenham todos os arquivos específicos"

#!/bin/bash
parent_dir="$1"
shift
find "$parent_dir" -type d |
while IFS= read -r subdir; do
  all_present=true
  for file in "$@"; do
    if [[ ! -f "$subdir/$file" ]]; then
      all_present=false
      break
    fi
  done
  $all_present && echo "$subdir"
done

as partes "IFS=" e "read -r" garantem que o valor de "dir" contenha o nome real do diretório, mesmo que inclua espaços ou caracteres especiais.

    
por glenn jackman 09.05.2012 / 16:33
1

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 ...

    
por Thomas 09.05.2012 / 15:33