일부 특정 폴더를 이동하고 미리 정의된 디렉터리 구조를 유지하는 방법은 무엇입니까?

일부 특정 폴더를 이동하고 미리 정의된 디렉터리 구조를 유지하는 방법은 무엇입니까?

약 7,000개의 폴더가 있는 디렉토리가 있습니다. 폴더는 zip에서 추출되었으며 일부 추출은 Python 스크립트를 사용하여 수행되었습니다. 이러한 폴더 중 일부는 다음과 같이 추출할 수 있습니다.

             Main Dir
                |
         ---------------
        |               |
      fold1            fold2
        |               |
      ------         -------
    |        |          |
  .pngs   .txts       fold2
                        |
                     -------
                    |       |
                  .pngs    .txts

요구 사항은 fold2폴더 범주를 데이터가 fold1포함된 동일한 이름의 다른 폴더가 아닌 데이터가 포함된 폴더와 유사한 디렉터리 구조로 이동하는 것입니다.

와 유사한 동종 구조의 모든 7k 폴더를 갖도록 bash 또는 명령줄을 사용하여 이 작업을 수행하려면 어떻게 해야 합니까 fold1?

답변1

다음 스크립트 는 현재 작업 디렉토리에서 양식 경로를 검색 a/B/B/c하고 이를 로 압축 합니다 a/B/c.a/B/B/B/B/ca/B/ca/B/B/c/D/D/ea/B/c/D/e

이 옵션과 지원되는 구현을 find사용하려면 GNU가 필요합니다 . -regextype이것이 없다면 스크립트 끝에 있는 안전하지 않은 posix 버전을 확인하세요.mv-n

shopt -s dotglob failglob
find . -depth -regextype egrep -type d -regex '.*/([^/]*)/\1' -print0 |
while IFS= read -r -d '' path; do
  mv -n -t "$path/.." "$path"/* &&
  rmdir "$path"
done

임의의 경로 이름(공백, 특수 문자 *, 개행 문자까지)을 지원합니다.

이 명령은 다음을 보장합니다.아니요파일을 덮어쓰거나 삭제합니다. 왼쪽 트리의 경우 중복된 하위 디렉터리를 보존해야 합니다. 오류 메시지가 표시됩니다 rmdir: failed to remove './A/A'. 결과는 오른쪽에 표시됩니다.

. (before)               . (after)
└── A                    └── A
    ├── someFile             ├── someFile
    ├── collision            ├── collision
    └── A                    ├── anotherFile
        ├── collision        └── A
        └── anotherFile          └── collision

숨겨진 파일도 복사됩니다.

잘못된 Posix 버전

이 스크립트의 이식성이 높은 버전은 경로 내의 줄 바꿈을 처리할 수 없고, 위에 표시된 것과 같은 상황에서 파일을 덮어쓸 수 있으며, 숨겨진 파일을 이동할 수 없습니다(내부에 숨겨진 파일이 있는 경우 하위 디렉터리는 그대로 유지).

find . -depth -type d | grep -E -x '.*/([^/]*)/\1' |
while IFS= read -r path; do
  mv "$path"/* "$path/.." &&
  rmdir "$path"
done

답변2

이것이 필요한지 확실하지 않지만...

mv /maindir/fold2/ /maindir/renamed/
mv /maindir/renamed/fold2/ /maindir/fold2/

그 다음에,이름 바꾸기비어 있어야 합니다. 삭제하세요.

아니면 이것도 작업을 수행해야합니다

mv maindir/fold2/fold2/{*,.*} maindir/fold2/

그 다음에/maindir/fold2/fold2/비어 있어야합니다

관련 정보