![폴더를 폴더 자체로 이동하는 방법은 무엇입니까?](https://linux55.com/image/133549/%ED%8F%B4%EB%8D%94%EB%A5%BC%20%ED%8F%B4%EB%8D%94%20%EC%9E%90%EC%B2%B4%EB%A1%9C%20%EC%9D%B4%EB%8F%99%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
디렉토리가 있습니다
foo/
bar.txt
baz.yzw
wun/
a.out
이제 기본적으로 그 사이에 디렉토리를 추가하고 싶습니다.
foo/
var1/
bar.txt
baz.yzw
wun/
a.out
목적은 다른 콘텐츠를 추가 foo
하되 이전 콘텐츠와 별도로 유지하는 것입니다.
물론 나는 이것을 할 수 있다:
$ mkdir foo-new
$ mv foo foo-new
$ mv foo-new foo
또는
$ cd foo
$ mkdir var1
$ mv $(ls | grep -v var1) var1
그러나 어느 쪽도 우아해 보이지 않고 오류가 발생하기 쉽습니다.
더 좋은 방법이 있나요?
답변1
간단히 var1 디렉토리를 만들고 foo의 모든 파일/폴더를 var1로 이동한 다음 마지막으로 var1을 foo 내부로 이동할 수 있습니다.
$ mkdir var1
$ mv foo/* var1
$ mv var1 foo/
답변2
$ cd foo
$ mkdir var1
$ mv * var1
쉘과 mv
명령은 var1 디렉토리를 자체적으로 이동하려고 시도하지 않을 만큼 똑똑합니다.
답변3
나는 대략 당신이 했던 것처럼 디렉토리의 이름을 바꾸고 새 디렉토리로 옮길 것입니다. 와 var1/
사이에 내용을 삽입 하려면 foo
:
d=$(mktemp -d ./tmp.XXXXXX)
mkdir "$d"; mv foo "$d"/var1; mv "$d" foo
이는 디렉터리 내용에 적용됩니다. 그러나 디렉토리 소유자, 액세스 비트, ACL, 확장 속성, inode 번호 등도 고려하면 약간 복잡해집니다.
그대로 유지하려면 콘텐츠를 다시 만들고 이동 foo
해야 합니다 . var1
강타 사용:
cd foo
mkdir var1
shopt -s dotglob # to get any dotfiles
mv * var1 # ignore the error about moving var1 to itself
또는 오류를 방지하려면 다음을 사용하세요 extglob
.
shopt -s extglob
mv !(var1) var1
도트 파일은 포함 되지 $(ls | grep -v)
않으며 파일 이름에 공백이나 개행 문자가 포함되어 있으면 작동하지 않습니다(두 가지 이유).
답변4
rsync
아직 존재하지 않는 경우 이를 사용하여 대상 디렉터리(마지막 수준만)를 생성할 수 있지만, 이로 인해 나중에 삭제하거나 유지하게 될 빈 디렉터리가 생성됩니다.
rsync -rv [--remove-source-files] foo/* foo/var1
한 가지 옵션 -m, --prune-empty-dirs.
은prune empty directory chains from file-list
내동기화매뉴얼 페이지에 있지만 나는 그 일을 얻지 못했습니다!
--remove-source-files
중괄호 안에 넣었어요[경고하다]그것에 대해.
빈 디렉터리를 삭제합니다.
find foo/ -depth -type d -empty -execdir rmdir "{}" \;