부모 디렉토리로 이동하려는 하위 디렉토리에 많은 파일과 디렉토리가 있습니다. 대상 디렉토리에 덮어 써야 할 파일과 디렉토리가 이미 있습니다. 대상에만있는 파일은 그대로 두어야합니다. 강제 mv
로 할 수 있습니까? mv * ..
불만 ( )
mv: cannot move `xyz' to `../xyz': Directory not empty
내가 무엇을 놓치고 있습니까?
mv -f
정답이 아닌지 궁금 합니다.
부모 디렉토리로 이동하려는 하위 디렉토리에 많은 파일과 디렉토리가 있습니다. 대상 디렉토리에 덮어 써야 할 파일과 디렉토리가 이미 있습니다. 대상에만있는 파일은 그대로 두어야합니다. 강제 mv
로 할 수 있습니까? mv * ..
불만 ( )
mv: cannot move `xyz' to `../xyz': Directory not empty
내가 무엇을 놓치고 있습니까?
mv -f
정답이 아닌지 궁금 합니다.
답변:
당신은 명령을 사용하여 소스를 대상으로 복사 한 후 삭제해야합니다 cp -r * ..
다음을 rm -rf *
.
나는 당신이를 사용하여 디렉토리를 "병합"할 수 없다고 생각합니다 mv
.
mv
같은 파일 시스템에 있기 때문에 더 빠를까요? cp -l
실제로 파일을 이동하지 않고 하드 링크를 만드는 데 사용 하는 경우 어떻게 됩니까?
cp -a
대신 사용해야합니다 cp -r
.
cp -rl source destination && rm -r source
.
rsync
아마도 더 나은 옵션 일 것입니다. 간단합니다 rsync -a subdir/ ./
.
내 테스트 트리 filename
: contents
형식 :
./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir
달리기 rsync
:
$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3
제공합니다 :
./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir
그런 다음 에뮬레이션 mv
하려면 소스 디렉토리를 제거하고 싶을 것입니다.
$ rm -r subdir/
기부:
./file1:subdir
./file2:parent
./dir/file3:subdir
./dir/file4:dir
이것이 틀렸다면, 원하는 결과를 가진 유사한 예제를 제공 할 수 있습니까 (예 :이 답변의 상단 근처에서 테스트 트리 사용)?
rm -r
끝에 기본적으로와 동일하게 추가 했습니다 mv
.
mv
은 원자 적이며 inode 번호를 유지하므로 파일을 열어 둘 수 있으며 시간과 공간이 걸리지 않습니다.
cp -r; rm -r
입니다. 그런 의미에서 rsync
언급 할 가치가 있다고 생각 합니다.
rsync
--remove-source-files
매개 변수를 사용하여 복사 한 후 소스를 삭제할 수 있습니다 . 이것은 원하는 것을 할 수있는 편리한 방법이어야합니다.
에서 rsync man page
:
--remove-source-files sender removes synchronized files (non-dir)
cp -r; rm
여유 공간이 없어서 사용할 수 없었습니다 . 대신 rsync --remove-source-files
사용 된 디스크 공간을 최소화하여 정확히 동일한 파일을 복사하지 않았습니다.
cp
및 로이 작업을 수행 할 수 rm
있지만 방대한 양의 데이터를 복사하지 않고도 전송을 피하려고합니다. @mattdm는이 언급 자신의 의견 과 다른 질문에 대한 대답은 다양한 옵션에 대한 대한 자세한 설명이 있습니다.
cp -rlf source destination
rm -r source
기본적으로이 명령 -l
옵션은 cp
데이터를 새 파일로 복사하지 않고 파일에 대한 하드 링크를 만듭니다.
cp -al source destination
소유자 정보와 권한을 유지 하기 위해 변경했습니다 .
cp
기본적으로 덮어 씁니다. 이 -f
옵션은 파일 rm
을 새로 복사하기 전에 (와 같이 ) 파일을 제거하려고 시도 합니다. 프로세스에서 파일을 쓰기 위해 파일을 열 수없는 경우 도움이 될 수 있지만 일부 사람들은 대신 오류가있는 것을 선호합니다. OP에 중요한지 모르겠지만 -f
어쨌든 내 대답에 플래그를 추가했습니다 .
아래 /path/to/source/root
에서 파일을 아래 의 해당 경로로 이동하는 스크립트가 있습니다 /path/to/destination/root
.
테스트되지 않은 코드를 조심하십시오.
export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' \; -o \
-exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
-o -exec sh -c '
if ! [ -e "$dest/$0" ]; then
mv -f "$0" "$dest/$0"
fi
' {} \;
\;
이전 이 필요하며 이스케이프해서는 안됩니다 . – 그냥-o
find
!
if
!
\!
이 스레드는 몇 년 동안 존재했지만 여전히 Google에서 1 위를 차지하므로 다른 방법을 추가하고 싶었습니다. 내가 일반적으로하는 방법 : 하위 디렉토리 내용을 tarball로 압축하고 tarball을 상위 디렉토리로 이동시킨 다음 기본 --overwrite 동작으로 추출하십시오. 이것은 당신이 찾고있는 것을 정확하게 수행합니다. 이후에 하위 디렉토리를 제거 할 수 있습니다.
cd xyz
tar -cvzpf tmp.tar.gz *
mv tmp.tar.gz ../tmp.tar.gz
cd ..
tar -xvzpf tmp.tar.gz
rm -rf xyz
rm -f tmp.tar.gz
저장 공간이 충분하면 다음과 같은 방법으로 수행 할 수 있습니다.
mv -bfv directory_1/* directory_2/ # all duplicate source files/directories
# will have ~ appended to them
find -name "*~" -delete # will recursively find and delete all files
# with ~ on the end
끝에 ~가있는 중요한 파일이 없는지 확인하십시오. 파일이 있으면 --suffix=whateveryouwant
기본값 대신 추가 할 수 있습니다 .
mv -f
?