디렉토리를 자신에게 복사하는 오류를 어떻게 수정합니까?

디렉토리를 자신에게 복사하는 오류를 어떻게 수정합니까?

다음과 같은 상황을 고려하면...

<path>/mydir1/mydir2

...mydir2 위치가지고 있어야 한다mydir1을 덮어쓰지만 내부에 위치하며 두 디렉터리 모두 실제로 동일한 파일 이름을 갖습니다. 이 문제는 어떻게 해결되나요?

다음을 시도하거나 다음 mv <path>/mydir/mydir/* <path>/mydir/과 같은 mv <path>/mydir <path>/ 결과를 초래합니다.

mv: cannot move `<path>/mydir/mydir` to a subdirectory of itself, `<path>/mydir`

이것은 충분히 간단해 보이지만 지금은 너무 늦어서 알아낼 수 없습니다.

복구해야 할 디렉터리는 17개입니다(각 디렉터리의 경로는 다르지만 mydir 이름은 동일함).


확인하자면 다음과 같은 이유로 오류 메시지가 발생할 수 있습니다.

# cd /경로/to/디렉토리
# mv mydir/mydir ./
mv: 'mydir/mydir'을 자체 하위 디렉터리 './mydir'로 이동할 수 없습니다.

또한 시도했습니다:

# mv mydir/mydir/* mydir/
mv: 'mydir/mydir/otherdir1'을 자체 하위 디렉터리 'mydir/otherdir1'로 이동할 수 없습니다.
mv: 'mydir/mydir/otherdir2'를 자체 하위 디렉터리 'mydir/otherdir2'로 이동할 수 없습니다.

그리고...

# mv /path/to/directory/mydir/mydir/otherdir1 /path/to/directory/mydir/
mv: '/path/to/directory/mydir/mydir/otherdir1'을 자체 하위 디렉토리 '/path/to/directory/mydir/otherdir1'로 이동할 수 없습니다.

그리고 임시 디렉터리를 사용하세요.

# mv mydir/mydir ./mydir-temp
# mv mydir-temp/* mydir/
mv: 'mydir-temp/otherdir1'을 자체 하위 디렉터리 'mydir/otherdir1'로 이동할 수 없습니다.
mv: 'mydir-temp/otherdir2'를 자체 하위 디렉터리 'mydir/otherdir2'로 이동할 수 없습니다.


비슷한 질문을 찾았습니다."하위 폴더에 있는 모든 파일(숨겨진 파일 포함)을 *nix의 상위 폴더로 재귀적으로 이동하는 방법은 무엇입니까?"이것은 mv bar/{,.}* .그것이 가능하다는 것을 보여줍니다.

그러나 이것은 또한 동일한 오류를 생성하며 .어디에서나 선택하는 데 혼란을 줍니다...

# CD 디렉토리
# mv mydir/{,.}* .
mv: 'mydir/otherdir1'을 자체 하위 디렉터리 './otherdir1'로 이동할 수 없습니다.
mv: 'mydir/otherdir2'를 자체 하위 디렉터리 './otherdir2'로 이동할 수 없습니다.
mv: 'mydir/'을(를) 이동할 수 없습니다. "./."로: 장치 또는 리소스가 사용 중입니다.
mv: 'mydir/..'을(를) './..'(으)로 이동할 수 없습니다. 장치 또는 리소스가 사용 중입니다.
mv: `./.file'을 덮어쓰나요? 와이


또 비슷한 질문"리눅스 mv 명령이 이상해요"는 mv덮어쓰지 않으며 복사본이 필요함을 나타냅니다.

# CD 디렉토리
# cp -rf ./mydir/* ./
cp: `./otherdir1/file1'을 덮어쓰나요? 와이
cp: `./otherdir1/file2'를 덮어쓰나요? 와이
cp: `./otherdir1/file3'을 덮어쓰나요?

이것은 작동하는 것 같습니다...파일(및 디렉토리)이 많다는 점을 제외하고는 각각을 확인하고 싶지 않습니다! f이건 막아야 하지 않겠 습니까?

좋아, cp별칭을 지정 하고 cp -i( discover 를 사용함 type cp) this 를 사용하여 우회하면 \cp -rf ./mydir/* ./작동하는 것 같습니다.

디렉터리/파일을 한 곳에서 다른 곳으로 이동하는 문제를 해결했지만 이 문제에 정확히 무슨 일이 일어나고 있는지 여전히 궁금합니다. mv이것이 실제로 의도적인 기능입니까?워너는 제안한다?

답변1

먼저 새 디렉터리를 밖으로 이동한 다음(충돌을 피하기 위해 임시 이름을 사용) 원래 디렉터리를 삭제한 다음 새 디렉터리의 이름을 바꿉니다. 참고: 콘텐츠를 대량으로 삭제해야 하므로 명령을 실행하기 전에 신중하게 생각하고 먼저 백업이 있는지 확인하세요. 또한 명령 사이에 s를 사용하여 이것을 작성했기 &&때문에 하나가 실패하면 나머지는 실행되지 않습니다. 스크립트에서는 괜찮지만 수동으로 수행하는 경우에는 순서대로 입력하는 것이 좋습니다. 질문은 그만.

mv <path>/mydir/mydir <path>/mydir-temp &&
rm -R <path>/mydir &&
mv <path>/mydir-temp <path>/mydir

답변2

가장 좋은 방법은 다음과 같습니다.

for d in `ls -A`; do if [ "$d" != "TTT" ]; then cp -Rf $d TTT; fi; done

TTT 자체를 제외하고 현재 디렉터리의 모든 디렉터리를 TTT 디렉터리에 반복적으로 복사합니다. -A의 옵션을 사용하면 ls숨겨진 모든 디렉터리와 파일을 고려할 수 있지만 특수 파일은 볼 수 없습니다. 및 .. "$d" != "TTT"자체 복사를 피하기 위해 TTT 디렉토리를 조건부로 제외합니다. bash2개의 매개변수로 스크립트를 작성하고 로컬 또는 시스템 저장소에 저장하고 필요할 때 사용할 수 있습니다.

관련 정보