약 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/c
a/B/c
a/B/B/c/D/D/e
a/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/비어 있어야합니다