find의 출력을 diff의 입력으로 파이프하는 방법은 무엇입니까?

find의 출력을 diff의 입력으로 파이프하는 방법은 무엇입니까?

이것은 bash에 대한 기본적인 질문이지만 해결책을 찾을 수 없습니다.

동일한 이름의 파일이 포함된 하위 디렉터리가 많이 있으며 이러한 모든 파일의 ID를 비교하고 싶습니다.

파일 목록을 반환할 수 있습니다.

find . -name "protein.mol2"

파일이 쿼리로 사용될 수 있다는 것을 알고 있습니다.diff

diff -q --from-file dir1/file dir2/file dir3/file; echo $?

출력을 파이프 find로 연결 하는 방법은 무엇입니까 diff?

답변1

이 옵션을 사용 하면 하나의 파일에서 작업할 파일 목록을 읽는 --from-file대신 하나의 파일을 여러 파일과 비교할 수 있습니다 . tar --files-from비슷한 것이 있는데 --to-file, 둘 중 어느 것을 사용하는지는 변경의 상대적인 "방향"에 따라 달라집니다. 당신이 사용하는 것은 -q차이점이 있는지 여부를 나타내는 것일 뿐이므로 이것이 당신에게 중요하지 않기를 바랍니다.

참조 파일이 있고 이를 동일한 이름을 가진 파일 세트와 비교하려고 한다고 가정합니다. 따라서 다음 중 하나가 작동합니다.

diff -q --from-file dir1/protein.mol2 $(find . -name protein.mol2)
find . -name protein.mol2 | xargs diff -q --from-file dir1/protein.mol2

첫 번째 경우에는 diff한 번만 실행되며 컬렉션에서 차이점이 발견되면 종료 코드가 반영됩니다.

두 번째 경우에는 diff여러 번 실행될 수 있습니다. 두 번째 형식은 파일 수가 많고(또는 매우 긴 파일/디렉터리 이름) 명령 인수 제한(Linux 시스템에서 일반적으로 128kB)에 도달한 경우 사용할 수 있습니다.

답변2

노력하다

diff -q --from-file $(find . -name "protein.mol2" -print) ; echo $?
  • $( )기본적으로 find에서 삽입된 파일 목록을 작성합니다.

답변3

단지 그들의 신원을 비교하고 싶다면 체크섬과 같은 것을 사용하여 내용에 따라 파일에 태그를 지정하는 것을 고려해 볼 수 있습니다.

find . -name 'protein.mol2' -exec cksum {} + | sort

출력을 파일로 저장할 수 있습니다. 첫 번째 숫자 쌍이 동일한 줄은 (거의 확실하게) 동일한 파일을 나타냅니다. 이 명령의 확장은 ID별로 파일을 그룹화합니다.

find . -name 'protein.mol2' -exec cksum {} + |
sort |
while read c1 c2 file
do
    test "$c1-$c2" != "$o1-$o2" && echo
    echo "$file"
    o1="$c1" o2="$c2"
done


한 줄로 작성되지만 find . -name 'protein.mol2' -exec cksum {} + | sort | while read c1 c2 file; do test "$c1-$c2" != "$o1-$o2" && echo; echo "$file"; o1="$c1" o2="$c2"; done재사용을 위해 스크립트 파일에 넣는 것이 더 나을 수도 있습니다.

관련 정보