
소스 디렉토리에 최신 버전의 파일이 포함되어 있어 복사되지 않은 파일을 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 dirWhereFileExists
있습니다 .find .
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가 당신을 위해 일할 것입니까? "새 파일을 덮어쓰지 않음" 등 설명에 맞는 많은 옵션이 있습니다. 그리고 결과를 기록하도록 할 수도 있습니다. 나는 원격 및 로컬 파일 복사에 자주 사용합니다.
이를 통해 매우 세분화할 수도 있습니다.
행운을 빌어요.