깊이 기준에 따라 파일을 한 디렉터리 위로 이동

깊이 기준에 따라 파일을 한 디렉터리 위로 이동

다음과 같은 디렉터리 트리가 있습니다(간단히 말하면 말 그대로 수백 개의 폴더가 있습니다).

.
├── a
│   └── b
│       └── a.h5
├── b
│   ├── b
│   │   └── e.h5
│   └── c
│       ├── a.h5
│       └── b.h5
├── c
│   └── b
│       └── a.h5
├── d
│   ├── a.h5
│   └── e.h5
└── e
    └── e.h5

기본적으로 일부 .h5파일은 깊이가 1(예: d/a.h5, e/e.h5)이고 일부 파일은 깊이가 2(예: b/b/e.h5, b/c/b.h5, ...) 입니다.

다음과 같이 깊이 2의 파일을 모두 깊이 1에 있도록 이동하고 싶습니다.

.
├── a
│   └── a.h5
├── b
│   ├── e.h5
│   ├── a.h5
│   └── b.h5
├── c
│   └── a.h5
├── d
│   ├── a.h5
│   └── e.h5
└── e
    └── e.h5

나는 이것이 */*/*.h5(테스트를 통해) 내가 관심 있는 파일과 일치한다는 것을 알고 있지만 ls */*/*.h5, 시도해 보았 mv */*/*.h5 */*.h5더니 엉망이 되었습니다.

중복 파일은 이름을 바꾸는 것이 가장 잘 처리되지만 힌트도 작동합니다. 어떻게 진행해야 하나요?

추신: 내가 본 내용은 다음과 같습니다.

그러나 그들은 모두 단일 디렉토리에서 작동합니다.

답변1

이것이 시작이어야 합니다:

find . -mindepth 3 -maxdepth 3 -type f -execdir mv -i -v {} .. \;

mv -i기존 파일 덮어쓰기를 요청합니다 . -execdir명령을 실행하기 전에 파일의 디렉터리를 변경하십시오.

답변2

디렉터리 구조에서:

$ tree
.
├── a
│   └── b
│       └── a.h5
├── b
│   ├── b
│   │   └── e.h5
│   └── c
│       ├── a.h5
│       └── b.h5
├── c
│   └── b
│       └── a.h5
├── d
│   ├── a.h5
│   └── e.h5
└── e
    └── e.h5

12 directories, 8 files

다음 for루프를 사용하세요.

$ for f in */*/*.h5; do mv -v -- "$f" "${f%/*}/../"; done
»a/b/a.h5“ -> »a/b/../a.h5“
»b/b/e.h5“ -> »b/b/../e.h5“
»b/c/a.h5“ -> »b/c/../a.h5“
»b/c/b.h5“ -> »b/c/../b.h5“
»c/b/a.h5“ -> »c/b/../a.h5“

이것결과:

$ tree
.
├── a
│   ├── a.h5
│   └── b
├── b
│   ├── a.h5
│   ├── b
│   ├── b.h5
│   ├── c
│   └── e.h5
├── c
│   ├── a.h5
│   └── b
├── d
│   ├── a.h5
│   └── e.h5
└── e
    └── e.h5

12 directories, 8 files

설명하다:

for f in */*/*.h5; do mv -v -- "$f" "${f%/*}/../"; done
  • for f in */*/*.h5모든 필수 파일을 반복합니다.
    • mv -v --자세히 터치해 보세요. --대시가 포함된 파일 이름이 인수로 해석되는 것을 방지합니다.
    • "$f"원본 파일 이름
    • ${f%/*}/../파일이 포함된 추가된 디렉터리의 이름입니다 ../. 경로는 "한 디렉터리 위"로 해석됩니다.

답변3

노력하다

 for x in */*/*.h5
 do
    mv "$x" "$(dirname $(dirname $x))"
 done

디렉토리 이름에 이상한 문자가 없는 경우.

또는 다른 옵션:

ls */*/*.h5 | awk -F/ '{print "mv \"%s\"  \"%s/%s\" \n",$0,$1,$3 ;}' | bash

삭제 | bash하면 미리보기를 볼 수 있습니다.

관련 정보