대상 경로에서 원본.file과 이름이 같고 원본.file과 이름이 같은 모든 파일을 new.file로 바꾸고 싶습니다. 이를 수행하는 명령은 무엇입니까?
파일의 내용을 업데이트했고 이제 특정 경로에 있는 해당 파일의 다른 모든 복사본도 업데이트하고 싶다고 가정해 보겠습니다.
대부분의 경우 다음 코드가 작동합니다.
find /target_path/ -iname "original.file" -exec cp new.file '{}'
그러나 만일원본 파일예를 들어 readme.txt를 사용하면 관련 없는 파일을 많이 덮어쓰게 됩니다.
답변1
이를 위해서는 실행을 결정하기 전에 체크섬이 일치하는지 테스트해야 하며 , 찾을 인수 cp
로 하위 쉘을 실행해야 합니다 . -exec
이 작업을 수행해야 합니다.
find /target_path/ -iname "original.file" -exec bash -c \
'[[ $(md5sum "original.file") = $(md5sum "{}") ]] && cp "new.file" "{}"' \;
답변2
파일 하드 링크의 동일한 복사본을 모두 만들 수 있다면 더 쉬울 것입니다. 한 가지 방법은 다음과 같습니다.레플리카: 달리기 fdupes -L
. 그런 다음 파일을 변경하면 하드 링크가 유지됩니다.
이름과 내용 또는 이름과 해시로만 파일을 찾으려면 명령에 다른 조건을 추가하기만 하면 됩니다 find
.
find /target_path/ -iname "original.file" -exec cmp old.file {} -exec cp new.file {}
find /target_path/ -iname "original.file" \
-exec sh -c 'test "$(md5sum | sed "s/ .*//")" = "$1" <"$0"' {} "$(cat old.md5sum)" \
-exec cp new.file {}
귀하의 지원서가 무엇인지 밝히지 않으셨습니다. 참여하는 데 도움이 될 수도 있고 그렇지 않을 수도 있습니다.일관된, 어느원격 동기화 중에 서로 다른 경로에 있는 동일한 파일을 감지할 수 있습니다..