현재 문제

현재 문제

다음과 같은 폴더 구조가 있습니다.

foo
`----> bar

bar콘텐츠 를 추출하는 방법은 무엇입니까 foo?

mv -f bar/* .내부 에서 시도해 봤습니다 foo.

-f, --force 덮어쓰기 전에 묻지 않음 |

그런데 " 디렉토리가 비어 있지 않아 이동할 수 없습니다."라는 메시지 bar/ajax가 나타납니다.foo/ajax

이 문제를 어떻게 해결할 수 있나요?

답변1

mv파일을 덮어쓰지만 덮어쓰기는 거부됩니다.목차. 디렉터리를 병합하고 소스 디렉터리를 삭제하는 명령은 없습니다(아마도 여러분이 원하는 것일 것입니다 mv). rsync --remove-source-files빈 디렉토리가 남을 수도 있습니다.

다음 명령 조합을 사용할 수 있습니다.

cp -a dev/. .
rm -r dev

dev모든 것을 현재 디렉터리에 복사한 다음 dev디렉터리를 삭제합니다.

또는:

rsync -a --remove-source-files dev/ .
find dev -depth -type d -exec rmdir {} \;

rsync모든 파일을 이동한 다음 남겨진 빈 디렉터리를 삭제하는 데 사용됩니다 .

답변2

현재 문제

foo/bar/콘텐츠를 최대로 이동하려고 합니다 foo/.

참고하겠습니다슈퍼유저에 관한 이 기사또한이 기사는 서버 오류에서 나온 것입니다.솔루션에서.

해결책

사용자 Stephan202에 따르면, 이 작업을 수행하기 위해 다음 명령을 찾고 있습니다.

cd /path/to/foo/bar
mv * .[^.]* ..

foo/bar/내부에서 다음 명령을 실행할 수도 있습니다 .

(shopt -s dotglob; mv -- * ..)

올바른 권한이 있는지도 확인하세요. 필요한 경우 루트(sudo) 권한으로 명령을 실행합니다.

결론적으로

이 답변에 대해 질문이나 문의사항이 있으면 댓글을 남겨주세요. 명령을 시도하기 전에 제가 제공하는 각 링크를 주의 깊게 읽어 보시기 바랍니다. 오해를 바로잡고 게시물을 개선할 수 있도록 피드백을 보내주셔서 감사합니다. 필요한 경우 답변을 업데이트할 수 있습니다.

행운을 빌어요!

답변3

편집하다:장단점을 보여주기 위해 이 답변을 수정했습니다.

일부 매뉴얼 페이지는 해당 정보 매뉴얼에 정보가 언급되어 있으므로 매우 간결합니다.

남성

-f, --force

       덮어쓰기 전에 메시지가 표시되지 않음

정보

        노트: mv교체만 해드립니다빈 디렉토리목적지에. 진단에서는 충돌하는 인구 디렉토리를 건너뜁니다.

[...]

-에프, - 힘

       대상 파일이 존재하는 경우하지만 일반적으로 쓸 수는 없습니다, 표준 입력은 터미널이고 -f또는 옵션이 제공되지 않으며 사용자에게 파일을 바꿀지 묻는 메시지가 표시됩니다. (파일을 소유하거나 해당 디렉터리에 대한 쓰기 권한이 있을 수 있습니다.) 응답이 긍정적이지 않으면 파일을 건너뜁니다.--forcemv

mv비어 있지 않은 디렉터리는 교체할 수 없지만 사용자가 소유한 기존 파일은 덮어쓸 수 있으며 일반적으로 쓸 수 없습니다(소유자는 쓰기 권한이 없습니다. 인용 참조).

foo    
|-- ajax
`-- bar
    `-- ajax

디렉터리를 병합 foo/ajax하고 foo/bar/ajax모든 파일을 유지하거나 제안된 대로 동일한 파일을 덮어쓸 수 있습니다.@murulu.

그러나 이 방법은 해당 디렉터리의 내용이 관련이 없는 경우에는 적합하지 않습니다. 언뜻 보기에는 명확하지 않을 수 있으므로 새로운 트리를 살펴보겠습니다.

prompt% tree home/network
home/network/
├── data
│   ├── img
│   │   └── demo.png
│   └── src
│       ├── contact.pdf
│       └── report.pdf
├── hardware
│   ├── api
│   ├── docs
│   └── src
│       └── driver.c
├── misc
│   └── src
│       └── init.py
├── README
└── src
    ├── main.c
    └── manager.c

콘텐츠를 같은 이름의 디렉터리 로 이동 network/data하고 선택적으로 병합할 수 있습니다(아래 참조).network

prompt% cp -ab home/network/data/* home/network
prompt% rm -r home/network/data/*
prompt% tree home/network
home/network/
├── data
├── hardware
│   ├── api
│   ├── docs
│   └── src
│       └── driver.c
├── img
│   └── demo.png
├── misc
│   └── src
│       └── init.py
├── README
└── src
    ├── contact.pdf
    ├── main.c
    ├── manager.c
    └── report.pdf

network/src이동 후 최종 디렉터리에 관련 없는 파일이 포함될 수 있음 을 알 수 있습니다 . 원하지 않는 경우 이동 후 동일한 이름으로 파일과 디렉터리의 이름을 바꿀 수 있습니다.

prompt% mv -b -S "_data" home/network/data/* home/network
prompt% tree home/network
home/network/
|-- README
|-- data
|-- hardware
|   |-- api
|   |-- docs
|   `-- src
|       `-- driver.c
|-- lib
|   `-- demo.png
|-- misc
|   `-- src
|       `-- init.py
|-- src
|   |-- contact.pdf
|   `-- report.pdf
`-- src_data
    |-- main.c
    `-- manager.c

답변4

이동 명령을 사용하면 됩니다.

cd foo
mv bar/* .

Jeff Schaller가 제안한 것처럼

 shopt -s dotglob 

mv 명령 전에 숨겨진 파일을 이동하십시오. -i덮어쓰기 전에 대화식으로 확인하려면 mv 옵션을 사용하십시오.

관련 정보