rsync를 사용하여 파일을 복사하는 대신 하드 링크 만들기

rsync를 사용하여 파일을 복사하는 대신 하드 링크 만들기

다음 명령은 포함하는 foo(포함하지 않는 bar) 모든 파일을 재귀적으로 찾고 대상 디렉터리의 디렉터리 구조를 유지합니다. 예를 들어 /path/to/2017/foo.psresp 및를 포함하는 디렉터리 아래에 /path/to/2018/foo.pdf하위 디렉터리를 생성합니다 2017. .2018~/path/to/dir/foo.psfoo.pdf

find . -iname \*foo\*pdf -exec rsync -R --exclude='*bar*' {} ~/path/to/dir/ \;

복사본 대신 하드 링크로 끝나는 이 명령과 동등한 것은 무엇입니까?

답변1

아무도 이 작업을 수행하지 않았으므로 제목 질문에 대답하려면 를 사용할 수 있습니다 . 일반적으로 복사본 대신 하드 링크를 사용하여 --link-destrsync 동기화를 사용하려는 경우 다음을 수행할 수 있습니다.s/d/

rsync -r --link-dest="$PWD/s/" s/ d/

전체 디렉터리가 아닌 파일을 지정하려는 특정 요구 사항에 따라 다음을 수행할 수 있습니다.

find . \
  -iname \*foo\*pdf \
  -exec bash -c '
    rsync -R \
      --exclude="*bar*" \
      --link-dest="$PWD/$(dirname "$1")" \
      "$1" \
      ~/path/to/dir/
  ' sh {} \;

여기서 bash를 도입한 이유는 dirname파일 경로를 얻을 수 있기 위해서입니다. --link-dest파일 자체보다는 디렉터리가 필요합니다. 또한 현재 디렉터리가 아닌 대상 디렉터리를 기준으로 하기 $PWD때문에 사용합니다 .--link-dest

답변2

이것은 rsync의 작업처럼 보이지 않습니다. Rsync는 재귀 복사에 가장 유용하지만 분명히 일반 파일만 복사하고 싶을 것입니다. rsync여기서 유일한 장점 cp은 필요에 따라 상위 디렉터리를 생성한다는 것입니다. 작은 쉘 스크립트 호출을 사용하여 mkdir이를 수행 할 수 있습니다.

find . -type f -iname '*foo*.pdf' ! -name '*bar*' \
       -exec sh -c 'mkdir -p "~/path/to/dir/${0%/*}" && cp "$0" ~/path/to/dir/"$0"' {} \;
  • 비정규 파일(디렉토리 등)을 제외하려면 명령 -type f에 추가하세요 . 일반 파일에 대한 심볼릭 링크를 처리하는 find데에도 사용됩니다 .-xtype f
  • ! -name '*bar*'rsync --exclude옵션과 동일합니다.
  • sh -c '…' {}쉘 스크립트를 실행 하고 $0찾은 파일 이름을 find.
  • mkdir -p …필요에 따라 대상 디렉터리와 상위 디렉터리를 만듭니다.

대신 여기서 하드 링크를 ln생성 할 수 있습니다.cp


아니면 당신은 사용할 수 있습니다다루기 힘든~의zmv기능. zsh에서:

setopt extended_glob
autoload zmv
mkdir_ln () {
  mkdir -p -- $2:h
  ln -- $1 $2
}
zmv -p mkdir_ln '**/(#i)*foo*.pdf~**/*bar*' ~/path/to/dir/'$f'
  • zmv -p mkdir_ln PATTERN REPLACEMENT일치하는 각 항목을 호출하고 다음으로 바꿉니다.mkdir_ln FILENAME REPLACEMENTFILENAMEPATTERN$fREPLACEMENTFILENAME
  • mkdir -p -- $2:h$2필요에 따라 디렉터리 섹션과 상위 디렉터리를 만듭니다.
  • **/…하위 디렉터리의 파일을 재귀적으로 일치시킵니다.
  • (#i)대소문자를 구분하지 않는 일치를 시작합니다.
  • ~**/*bar*이름 포함을 제외합니다 bar.

답변3

직업인 것 같아요 pax:

find . -iname '*foo*pdf' ! -name '*bar*' -print0 |
  pax -0rwl ~/path/to/dir/

pax비표준을 지원하지 않는 경우 에서 -0제거하세요 . 단, 파일 경로에 개행 문자가 포함되어 있으면 제대로 작동하지 않는다는 점에 유의하세요.0-print0-0rwl

(POSIX, 하지만 GNU는 아님) 이 없다면 (GNU, 하지만 POSIX는 아님) pax로 바꿔보세요 .cpio -0pd

관련 정보