폴더를 폴더 자체로 이동하는 방법은 무엇입니까?

폴더를 폴더 자체로 이동하는 방법은 무엇입니까?

디렉토리가 있습니다

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 "{}" \;

관련 정보