무한 루프 없이 상위 디렉터리를 하위 디렉터리로 복사

무한 루프 없이 상위 디렉터리를 하위 디렉터리로 복사

애플리케이션 특정 이유로 인해 전체 상위 디렉토리를 하위 디렉토리에 복사해야 합니다. 예를 들어,

cp -r ../ tmp/

이것의 문제는 tmp/의 내용을 계속해서 재귀적으로 복사하면서 무한 루프에 빠지게 된다는 것입니다.

이 문제를 해결하는 방법은 디렉토리를 압축하고 tmp로 추출하는 등 여러 가지가 있지만 특별히 우아한/unixy 솔루션이 있는지 궁금합니다.

(참고: 저는 Apple OS/X를 사용하고 있습니다.)

답변1

상위 디렉토리에서 시작하는 경우 findGNU를 사용하여 이를 수행 할 수 있습니다 cp. 현재 있는 디렉토리(포함 디렉토리 tmp)의 이름이 지정되어 있고 folder해당 디렉토리가 tmp비어 있다고 가정하면 다음을 실행할 수 있습니다.

cd ..
find . -path ./folder/tmp -prune -o -type f -exec cp --parents -t folder/tmp {} +

이는 find에게 아래의 모든 항목 .(이전 항목 ..)을 나열하도록 요청합니다. 일치하는 경우 제외하고 ./folder/tmp, 그렇지 않으면 파일인 경우 cp옵션 에 전달합니다( 소스 계층 구조를 다시 작성 --parents하도록 지시함 ).cp

tmp아직 복사해야 할 파일이 이미 있는 경우 다음 변형은 Unix-y가 약간 적습니다.moreutils' sponge) 그러나 다음을 건너뛰지 마십시오 tmp.

cd ..
find . -type f -print0 | sponge | xargs -0 cp --parents -t folder/tmp

sponge복사할 파일 목록을 다른 위치에 저장하면 이를 방지할 수 있습니다(그러나 그렇게 하면 덜 우아해집니다).

cd ..
find . -type f -print0 > /tmp/filelist
xargs -0 cp --parents -t folder/tmp < /tmp/filelist
rm /tmp/filelist

cp다음을 사용하면 GNU 요구 사항을 피할 수 있습니다 cpio.

cd ..
find . -type f -print0 > /tmp/filelist
cpio -pmd0 folder/tmp < /tmp/filelist
rm /tmp/filelist

또는

cd ..
find . -type f -print0 | sponge | cpio -pmd0 folder/tmp

비어 있으면 tmp다음 요구 사항을 피할 수도 있습니다 moreutils.

cd ..
find . -path ./folder/tmp -prune -o -type f -print0 | cpio -pmd0 folder/tmp

답변2

대화형 사용을 위해 mv에 대한 유사한 사례를 수정했습니다.

cd ..
mv * tmp

mv: cannot move ‘tmp’ to a subdirectory of itself, ‘tmp/tmp’

오류를 무시하세요. 다른 모든 항목은 이동되었습니다. :-P. cp와 동일하게 작동하지 않으며 빈 tmp/tmp를 생성하는데 이는 아마도 원하는 것이 아닐 것입니다.

답변3

사용 pax, 복사 ., subdir/tmp건너뛰기 subdir/tmp:

mkdir -p subdir/tmp &&
  pax -rws'|^\./subdir/tmp/.*||' . subdir/tmp

또는 다음을 수행할 수 있습니다.

mkdir -p subdir/tmp/subdir &&
  ln -s tmp subdir/tmp/subdir/tmp &&
  cp -a . subdir/tmp

subdir/tmp/subdir/tmp그러면 이는 자신을 가리키는 기호 링크이며 cp그 아래에는 아무것도 생성되지 않습니다. 필요한 경우 나중에 빈 디렉터리로 바꿀 수 있습니다.

관련 정보