애플리케이션 특정 이유로 인해 전체 상위 디렉토리를 하위 디렉토리에 복사해야 합니다. 예를 들어,
cp -r ../ tmp/
이것의 문제는 tmp/의 내용을 계속해서 재귀적으로 복사하면서 무한 루프에 빠지게 된다는 것입니다.
이 문제를 해결하는 방법은 디렉토리를 압축하고 tmp로 추출하는 등 여러 가지가 있지만 특별히 우아한/unixy 솔루션이 있는지 궁금합니다.
(참고: 저는 Apple OS/X를 사용하고 있습니다.)
답변1
상위 디렉토리에서 시작하는 경우 find
GNU를 사용하여 이를 수행 할 수 있습니다 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
그 아래에는 아무것도 생성되지 않습니다. 필요한 경우 나중에 빈 디렉터리로 바꿀 수 있습니다.