여러 폴더를 다음과 같은 구조로 정렬하고 싶습니다.
예를 들어:
/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"를 제거하십시오.