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

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

Estou procurando 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 eles 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.

Responder1

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"

Responder2

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

Responder3

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

Responder4

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

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

Usar lsem Scripts é sempre problemático e normalmente desencorajo usá-lo, mas se você tiver uma visão geral de todos os arquivos do diretório onde a pesquisa começa, e ele não contém espaços em branco, nem caracteres especiais como "*" ou "? ", "<" ou "|", deve ser salvo para utilizá-lo.

informação relacionada