MV 하위 디렉터리는 한 수준 위이지만 루트 디렉터리까지는 아닙니다.

MV 하위 디렉터리는 한 수준 위이지만 루트 디렉터리까지는 아닙니다.

여러 폴더를 다음과 같은 구조로 정렬하고 싶습니다.

예를 들어:

/root/sub1/aaaa/bbbb/cccc/dddd
/root/sub2/aaaa/bbbb/cccc/dddd
/root/sub3/aaaa/bbbb/cccc/dddd
/root/sub4/aaaa/bbbb/cccc/dddd

이는 다음 폴더 외에는 아무것도 포함하지 않는 중첩된 폴더입니다.

이 길을 끊고 싶다

/root/sub1/dddd
/root/sub2/dddd
/root/sub3/dddd
/root/sub4/dddd

폴더를 루트 수준 폴더로 이동하는 것이 아니라 상위 폴더 바로 아래로 이동하고 싶습니다.

실행하기에 가장 좋은 명령은 다음과 같습니다.

mv sub*/aaaa/bbbb/cccc/dddd

그러나 이렇게 하면 모든 것이 루트 수준으로 돌아갑니다.

또는 각 하위 폴더에서 명령을 실행할 수도 있지만 여전히 지루합니다.

mv aaaa/bbbb/cccc/dddd

답변1

파일은 서로 다른 디렉터리에 있어야 하므로 이 작업을 mv여러 번 실행해야 하며 각 대상 디렉터리에 대해 적어도 한 번은 실행해야 합니다. 다음을 실행하여 mv이 작업을 수행할 수 있습니다.for 루프.

for x in /root/*
do
  mv -i "$x"/*/*/*/* "$x"
done

mv디렉토리의 각 항목에 대해 루프(명령)의 본문을 차례로 실행합니다. /root루프 본문이 실행될 때 "$x"마다 경로로 대체됩니다 /root/subN. 이 명령은 파일이 이동된 디렉터리로 mv -i "$x"/*/*/*/* "$x"파일을 이동합니다 ./root/sub1/aaaa/bbbb/cccc/dddd/root/sub1/root/sub1/dddd

옵션을 사용하면 대상 파일이 이미 존재하는지 묻는 메시지가 표시됩니다. 이는 -i및 가 모두 있는 경우 mv발생할 수 있습니다 ./root/sub1/aaa1/bbb/ccc/ddd/root/sub1/aaa2/bbb/ccc/ddd

답변2

find /root -maxdepth 6 -mindepth 6 -type d | awk -F \/ '{ print "mv "$0" "$1"/"$2"/"$3"/"$6 }' | sh

최대 및 최소 디렉토리 깊이에 특히 중점을 두고 find 명령을 사용한 다음 목록을 가져와서 awk를 통해 구문 분석하여 sh를 사용하여 실행할 수 있는 mv 명령을 작성합니다. 테스트를 위해 실행을 추가하기 전에 "| sh"를 제거하십시오.

관련 정보