encontrar o conjunto de arquivos comuns entre vários diretórios?

9

Eu estou olhando para comparar diretórios de temas Drupal. Um tema drupal é um diretório composto por vários arquivos, e estou tentando descobrir quais são essenciais. Por exemplo, todos podem ter um arquivo chamado template.phpou page.tpl.php.

Como posso encontrar o conjunto de todos os arquivos comuns para vários diretórios? No meu caso, todos os arquivos 'mesmos' (aqueles com o mesmo nome) estarão no mesmo diretório de nível.

user394
fonte
Existem algumas respostas na seção 'Shell Puzzle' do ukuug.org/newsletter/10.4 (embora sejam shell-golf-ish).
James Youngman

Respostas:

7

Liste todos os nomes (não caminhos) de arquivos comuns a todos os diretórios.

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

Ou chame-o como um arquivo de script ou função, com os diretórios como parâmetros.

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"
Peter.O
fonte
1

Você pode exibir uma lista de nomes classificados pelo número de diretórios em que aparecem.

find */ |              # traverse all the template directories
sort -t / -k 2 |       # sort, ignoring the first field
tr '/' '\t' |          # turn / into tabs
uniq -f 1 -c |         # count duplicates, ignoring the first field
tr '\t' '/' |          # turn tabs back into /
sort -t / -s -k 1n     # sort by the number of occurrences
Gilles 'SO- parar de ser mau'
fonte
0

Com o Meld, você pode comparar dois diretórios e ver quais arquivos estão presentes em um, e não no outro e vice-versa. Também pode mostrar as diferenças entre os arquivos comuns.

Bernhard
fonte
0

Para 3 diretórios, um deles o atual, e dois 'a' e 'b', você pode encadear o teste desta forma:

ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null

se os arquivos tiverem um padrão comum (como .php) e não contiverem espaços em branco nos nomes de arquivos.

O uso lsde scripts é sempre problemático e eu normalmente o desencorajo, mas se você tiver uma visão geral de todos os arquivos no diretório em que a pesquisa é iniciada e ela não contiver espaços em branco, nem caracteres especiais como "*" ou "?" "," <"ou" | ", deve ser salvo para usá-lo.

Usuário desconhecido
fonte