다음과 같은 디렉터리 트리가 있습니다(간단히 말하면 말 그대로 수백 개의 폴더가 있습니다).
.
├── 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
더니 엉망이 되었습니다.
중복 파일은 이름을 바꾸는 것이 가장 잘 처리되지만 힌트도 작동합니다. 어떻게 진행해야 하나요?
추신: 내가 본 내용은 다음과 같습니다.
- https://superuser.com/questions/62141/how-to-move-all-files-from-current-directory-to-upper-directory
- 파일을 디렉터리로 안전하게 대량 이동하는 방법은 무엇입니까?
그러나 그들은 모두 단일 디렉토리에서 작동합니다.
답변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
하면 미리보기를 볼 수 있습니다.