두 목록에있는 내용을 나열하는 간단한 스크립트를 작성하려고합니다. 단순화하기 위해 ls를 예로 들어 봅시다. "1"과 "2"가 디렉토리라고 상상해보십시오.
하나 =`하나 하나` 둘 =`ls 둘` 교차로 $ 1 $ 2
나는 여전히 bash에서 상당히 녹색이므로, 내가하는 일을 자유롭게 수정하십시오. "1"과 "2"의 모든 파일을 출력하는 명령이 필요합니다. 둘 다 존재해야합니다. 이것을 "1"과 "2"사이의 "교차"라고 부를 수 있습니다.
두 목록에있는 내용을 나열하는 간단한 스크립트를 작성하려고합니다. 단순화하기 위해 ls를 예로 들어 봅시다. "1"과 "2"가 디렉토리라고 상상해보십시오.
하나 =`하나 하나` 둘 =`ls 둘` 교차로 $ 1 $ 2
나는 여전히 bash에서 상당히 녹색이므로, 내가하는 일을 자유롭게 수정하십시오. "1"과 "2"의 모든 파일을 출력하는 명령이 필요합니다. 둘 다 존재해야합니다. 이것을 "1"과 "2"사이의 "교차"라고 부를 수 있습니다.
답변:
comm -12 <(ls 1) <(ls 2)
comm
오늘까지 내가 알지 못했다고 믿을 수 없다 . 이 방금 내 주 전체를 만들었습니다 :)
comm
입력을 정렬해야합니다. 이 경우 ls
출력을 자동으로 정렬하지만 다른 용도로 수행해야 할 수도 있습니다.comm -12 <(some-command | sort) <(some-other-command | sort)
public
방법의 사용법을 찾기 위해 이것을 사용 했습니다. 나는 달렸고 , 운 좋게도 특성이 포함 된 파일의 이름으로 끝났습니다. error()
git grep
$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
솔루션 comm
comm
훌륭하지만 실제로 정렬 된 목록으로 작업해야합니다. 그리고 다행히도 여기서 우리 ls
는 ls
Bash 맨 페이지 에서 어떤 것을 사용 합니다
-cftuSUX 또는 --sort가 없으면 알파벳순으로 항목을 정렬합니다.
comm -12 <(ls one) <(ls two)
와 대안 sort
두 목록의 교차점 :
sort <(ls one) <(ls two) | uniq -d
두 목록의 대칭 적 차이 :
sort <(ls one) <(ls two) | uniq -u
보너스
그것으로 플레이;)
cd $(mktemp -d) && mkdir {one,two} && touch {one,two}/file_{1,2}{0..9} && touch two/file_3{0..9}
덜 효율적인 (comm보다) 대안 :
cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
(ls 1; ls 2) | sort -u | uniq -d
.
sort -u | uniq -d
가 그들을 찾기 전에 정렬이 중복을 제거했기 때문에 체인 은 아무것도하지 않습니다. 내 명령이 무엇인지 이해하지 못했다고 생각합니다.
cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
으로 아무것도 출력 하지 못했습니다 . 내 명령은 을 표시 (ls 1; ls 2) | sort | uniq -d
하지 않고 -u
목록 교차를 표시 해야 합니다. @ MikaëlMayer는 내 원래 명령이 깨 졌다는 것이 옳았습니다.
ls
다른 것과 같이 대체 할 수 있기 때문 find
입니다. 명령 중 하나가 두 줄을 동일하게 반환하면 복제본으로 선택하기 때문에 솔루션에서이를 허용하지 않습니다. 사용자가 ls 1/*
하위 디렉토리의 모든 파일 을 수행 하고 비교 하려는 경우에도 작동합니다 . 그렇지 않으면 그렇습니다. 내 배쉬에 따라 다를 수 있습니다.
또 다른 Stackoverflow 질문 "bash의 배열 교차"가 중복으로 표시됩니다. 내 의견으로는 그 질문은 두 개의 bash 배열을 비교하는 것에 대해 이야기하지만이 질문은 bash 파일에 중점을두기 때문에 상당히 동일하지 않습니다. 현재 종료 된 다른 질문에 대한 한 줄 답변은 다음과 같습니다.
# List1=( 0 1 2 3 4 6 7 8 9 10 11 12)
# List2=( 1 2 3 5 6 8 9 11 )
# List3=($(comm -12 <(echo ${List1[*]}| tr " " "\n"| sort) <(echo ${List2[*]} | tr " " "\n"| sort)| sort -g))
# echo ${List3[*]}
1 2 3 6 8 9 11
comm 유틸리티는 영숫자 정렬을 수행하는 반면 "bash의 배열 교차"는 숫자를 사용합니다. 따라서 "정렬"및 "정렬 -g"사용법.