Estou tentando escrever um script simples que irá listar o conteúdo encontrado em duas listas. Para simplificar, vamos usar ls como exemplo. Imagine "um" e "dois" são diretórios.
one = `ls one` two = `ls two` interseção $ um $ dois
Ainda estou muito verde no bash, então fique à vontade para corrigir como estou fazendo isso. Eu só preciso de algum comando que imprima todos os arquivos em "um" e "dois". Eles devem existir em ambos. Você pode chamar isso de "interseção" entre "um" e "dois".
Respostas:
fonte
comm
até hoje. Isso só fez toda a minha semana :)comm
requer que as entradas sejam classificadas. Nesse caso,ls
classifica automaticamente sua saída, mas outros usos podem precisar fazer isso:comm -12 <(some-command | sort) <(some-other-command | sort)
public
métodoerror()
fornecido por uma característica, em combinação comgit grep
, e foi incrível! Eu corri$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
e, felizmente, acabei com o nome do arquivo apenas que continha a característica.Solução com
comm
comm
é ótimo, mas realmente precisa trabalhar com a lista classificada. Felizmente, aqui usamos a página de manualls
dols
BashAlternativa com
sort
Interseção de duas listas:
diferença simétrica de duas listas:
Bônus
Brinque com ele;)
fonte
Use o
comm
comando:"sort" não é realmente necessário, mas eu sempre o incluo antes de usar "comm" apenas por precaução.
fonte
Uma alternativa menos eficiente (do que comm):
fonte
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
não faz nada, porque a classificação removeu as duplicatas antes que o uniq comece a procurá-las. Eu acho que você não entendeu o que meu comando está fazendo.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
nada. Meu comando deve ler(ls 1; ls 2) | sort | uniq -d
, sem o-u
, para mostrar a interseção da lista. @ MikaëlMayer estava certo ao dizer que meu comando original foi quebrado.ls
por outra coisa, por exemplofind
. Sua solução não permite isso porque, se um dos comandos retornar duas linhas iguais, ele será copiado como duplicado. O meu funciona mesmo que o usuário queira fazerls 1/*
e comparar todos os arquivos entre subdiretórios. Caso contrário, sim, também funciona. É possível que o meu seja específico do bash.A junção é outra boa opção, dependendo da entrada e da saída desejada
fonte
Há outra pergunta sobre o Stackoverflow "Interseção de matriz no bash", marcada como uma duplicata. Na minha opinião, não é exatamente o mesmo, pois essa pergunta fala sobre a comparação de duas matrizes bash, enquanto essa pergunta se concentra nos arquivos bash. Uma resposta de uma linha para a outra pergunta, que agora está fechada, é a seguinte:
O utilitário comm faz uma classificação alfanumérica, enquanto as respostas "Array intersection in bash" usam números; daí o uso "sort" e "sort -g".
fonte