mv
“폴더”라는 폴더를 이미 “폴더”가 포함 된 디렉토리로 이동하는 경우 병합되거나 대체됩니까?
답변
mv
디렉토리를 병합하거나 덮어 쓸 수없는 경우 --force
옵션을 사용하더라도 “mv : ‘a’를 ‘b’로 이동할 수 없습니다 : 디렉토리가 비어 있지 않습니다” 라는 메시지와 함께 실패 합니다 .
다른 도구 (예 rsync
: find
, 또는 cp
)를 사용하여이 문제를 해결할 수 있지만 그 의미를 신중하게 고려해야합니다.
rsync
합니다 (이상적으로 다른에 하나의 디렉토리의 내용을 병합 할 수 있습니다--remove-source-files
(1 개) 안전에만 성공적으로 전송 된 그 소스 파일을 삭제하는 옵션, 그리고 보통의 허가 / 소유 / 시간 보존 옵션을 사용하여-a
당신이 원하는 경우)
… 그러나 이것은 전체 복사 작업입니다 따라서 디스크를 많이 사용합니다.- 현재 원하는 옵션 : 당신은 결합 할 수
rsync
의--link-dest=DIR
및 (가능한 대신 복사 파일 내용의 하드 링크 생성하기) 옵션을--remove-source-files
일반에 대한 의미와 매우 유사 얻을 수를mv
.
이를 위해 소스 디렉토리에--link-dest
대한 절대 경로 (또는 대상 에서 소스 까지의 상대 경로)를 제공해야 합니다 .
… 그러나 이것은 의도하지 않은 방식으로 (합병증을 유발하거나 유발하지 않을 수 있음) 사용하고 있으며 소스에 대한 절대 경로를 알고 (또는 결정하는) 필요 하며 빈 디렉토리 구조를 다시 정리합니다. 당 1 .--link-dest
--link-dest
- 당신은 사용할 수 있습니다
find
개별적 실제 파일을 이동 대상에서 소스 디렉토리 구조를 다시 순차적으로
… 하지만 이 소스를 여러 번을 통해 재귀해야하고 경쟁 조건 (새 디렉토리가 여러 단계의 과정 소스에서 생성되는 발생할 수 있습니다 ) cp
하드 링크를 만들 수 있습니다 병합과 매우 유사한 결과를 생성, (단순히 같은 기존 파일에 추가 포인터를 넣어)mv
(만 포인터가 생성되고 실제 데이터를 복사 할 수 없습니다 때문에 매우 IO-효율적입니다)
… 하지만 이 가능한 경쟁 조건으로 인해 다시 발생합니다 (이전 단계에서 복사되지 않았더라도 소스의 새 파일이 삭제됨)
이러한 해결 방법 (있는 경우) 중 적절한 것은 사용 사례에 따라 크게 다릅니다.
항상 그렇듯이 이러한 명령을 실행하고 백업을하기 전에 생각하십시오.
1 : rsync --remove-source-files
디렉토리를 삭제하지 않으므로 find -depth -type d -empty -delete
빈 소스 디렉토리 트리를 제거하려면 나중에 같은 작업을 수행해야합니다 .
답변
rsync -av /source/ /destination/
(after checking)
rm -rf /source/
답변
cp 명령 의 -l
옵션을 사용하면 전체 데이터 사본 대신 동일한 파일 시스템에 파일의 하드 링크 가 작성 됩니다. 다음 명령은 폴더 를 이미 이름이있는 디렉토리를 포함하는 상위 폴더 ( )에 복사합니다 .source/folder
destination
folder
cp -rl source/folder destination
rm -r source/folder
필요에 따라 -P
( --no-dereference
-심볼릭 링크를 역 참조하지 않음) 또는 -a
( --archive
-모든 메타 데이터 유지, -P
옵션 포함)을 사용할 수도 있습니다 .
답변
다음 4 단계를 권장합니다.
cd ${SOURCE};
find . -type d -exec mkdir -p ${DEST}/\{} \;
find . -type f -exec mv \{} ${DEST}/\{} \;
find . -type d -empty -delete
또는 더 나은 방법은 mv
다음 과 유사한 의미를 구현하는 스크립트입니다 .
#!/bin/bash
DEST="${@:${#@}}"
ABS_DEST="$(cd "$(dirname "$DEST")"; pwd)/$(basename "$DEST")"
for SRC in ${@:1:$((${#@} -1))}; do (
cd "$SRC";
find . -type d -exec mkdir -p "${ABS_DEST}"/\{} \;
find . -type f -exec mv \{} "${ABS_DEST}"/\{} \;
find . -type d -empty -delete
) done
답변
디렉토리를 병합하는 방법은 다음과 같습니다. 파일을 복사 한 다음 삭제하는 대신 파일 이름을 변경하기 때문에 rsync보다 훨씬 빠릅니다.
cd source; find -type f -print0 | xargs -0 -n 1 -I {} mv '{}' 'dest/{}'
답변
이를 달성하는 한 가지 방법은 다음을 사용하는 것입니다.
mv folder/* directory/folder/
rmdir folder
folder
및에 동일한 이름을 가진 두 파일이없는 directory/folder
한 동일한 결과 (예 : 병합)를 얻을 수 있습니다.
답변
가장 순수한 사본의 경우 tar (-) B blockread copy 방법을 사용합니다.
예를 들어, 소스 경로 내에서 (필요한 경우 ‘cd’) :
tar cBf - <sourcefolder> | (cd /your/target/folder ; tar xBf -)
소유자와 권한이 그대로있는 소스 트리의 정확한 사본이 생성됩니다. 대상 폴더가 있으면 데이터가 병합됩니다. 이미 존재하는 파일 만 덮어 씁니다.
예:
$ cd /data1/home
$ tar cBf - jdoe | (cd /data2/home ; tar xBf -)
복사 작업이 성공하면 소스 ( rm -rf <source>
)를 제거 할 수 있습니다 . 물론 이것은 정확한 이동이 아닙니다. 소스를 제거 할 때까지 데이터가 복사됩니다.
옵션으로 -v를 사용하여 자세한 내용을 볼 수 있습니다 (복사중인 파일을 화면에 표시). tar cBvf -
c
: 창조하다B
: 전체 블록 읽기 (파이프 읽기 용)v
: 자세한f
: 쓸 파일x
: 추출-
: stdout / stdin
sourcefolder
또한 일 수있다 *
(현재 폴더에 아무것도)