다음과 같은 폴더 구조가 있습니다.
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
또는 옵션이 제공되지 않으며 사용자에게 파일을 바꿀지 묻는 메시지가 표시됩니다. (파일을 소유하거나 해당 디렉터리에 대한 쓰기 권한이 있을 수 있습니다.) 응답이 긍정적이지 않으면 파일을 건너뜁니다.--force
mv
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 옵션을 사용하십시오.