-u 옵션을 사용하여 BASH에서 cp를 호출합니다.

-u 옵션을 사용하여 BASH에서 cp를 호출합니다.

소스 디렉토리에 최신 버전의 파일이 포함되어 있어 복사되지 않은 파일을 cp의 옵션으로 인쇄 할 수 있는 방법이 있습니까 ?--update

답변1

cp -ur사용. . . 교체 rsync -urvv.

두 개의 "v"는 오타가 아닙니다. 건너뛴 파일을 표시하기 위해 자세한 정보를 추가하기 위한 것입니다.

건너뛴 파일은 다음과 같으 the_filename is newer므로 건너뛴 파일 목록을 얻으려면 다음 코드 줄을 사용할 수 있습니다.

rsync -urvv source/ target | grep ' is newer$' | sed -e 's/ is newer$//'

또는 이 플래그 를 대화식으로 사용하려는 경우 --progress유용할 수 있습니다 .

답변2

이 작업을 직접 수행할 수 있는 방법은 없지만 cp기본적으로 동일한 작업을 수행해야 합니다.

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); print $1 } END { if (NR == 0) print "NOFILES" }' | xargs -I{} find . ! -name {} -maxdepth 1

이 작은 전문 용어에는 몇 가지 제한 사항이 있습니다.

1) 이는 "NOFILES"라는 파일이 존재하지 않는다는 사실에 달려 있습니다. awk필요에 맞게 명령에서 이 문자열을 변경할 수 있습니다 .

2) 기존 디렉토리에 있어야 합니다 file. 해당 디렉토리에 없으면 명령을 " 단일 디렉토리에서 복사하지 않는 경우 사용할 수 있습니다 " find로 변경해야 합니다 .find dirWhereFileExistsfind .find dir1 dir2...

3) 어떤 이유로 파일 이름에 백틱이나 작은따옴표를 포함하면 작동하지 않습니다.

아시다시피 이는 가장 강력한 솔루션은 아니지만 일회성 작업에 적합해야 합니다.

편집하다

오늘 아침에 일어나서 위의 해결책이 쓰레기라는 것을 깨달았습니다. 여러 파일을 복사하려고 하면 파일 개수만큼 검색하지만 매번 한 파일만 제외합니다. 그러나 다음 해결 방법이 작동합니다.

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); regex = $1 "|" regex } END { if (NR == 0) { regex = "NOFILES|" } print ".*/("substr(regex, 0, length(regex))")" }' | xargs -I{} find . -regextype posix-extended ! -regex {} -maxdepth 1

정규식을 작성하여 전달합니다 find. 위와 동일한 제한사항이 적용됩니다.

전에는 바보같이 굴어서 미안해요. 지금 StackOverflow를 시작하기에는 너무 늦은 것 같아요.

답변3

rsync가 당신을 위해 일할 수 있습니까? "새 파일을 덮어쓰지 않음" 등과 같이 설명에 맞는 다양한 옵션이 있습니다. 결과를 기록하도록 할 수 있습니다. 원격 및 로컬 파일 복사에 자주 사용합니다.

이를 통해 매우 세분화된 정보를 얻을 수도 있습니다.

행운을 빌어요.

관련 정보