다음 명령은 포함하는 foo
(포함하지 않는 bar
) 모든 파일을 재귀적으로 찾고 대상 디렉터리의 디렉터리 구조를 유지합니다. 예를 들어 /path/to/2017/foo.ps
resp 및를 포함하는 디렉터리 아래에 /path/to/2018/foo.pdf
하위 디렉터리를 생성합니다 2017
. .2018
~/path/to/dir/
foo.ps
foo.pdf
find . -iname \*foo\*pdf -exec rsync -R --exclude='*bar*' {} ~/path/to/dir/ \;
복사본 대신 하드 링크로 끝나는 이 명령과 동등한 것은 무엇입니까?
답변1
아무도 이 작업을 수행하지 않았으므로 제목 질문에 대답하려면 를 사용할 수 있습니다 . 일반적으로 복사본 대신 하드 링크를 사용하여 --link-dest
rsync 동기화를 사용하려는 경우 다음을 수행할 수 있습니다.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 REPLACEMENT
FILENAME
PATTERN
$f
REPLACEMENT
FILENAME
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