하위 디렉터리를 찾아 새 상위 디렉터리로 재구성

하위 디렉터리를 찾아 새 상위 디렉터리로 재구성

다음과 같은 폴더 구조가 있습니다.

/Folder1/Folder2/output/0653/3547/0112945601/ 
/Folder1/Folder2/output/0653/3547/0112945602/

5번째 하위 폴더 만 변경되었습니다.

5번째 하위 폴더를 모두 나열 하고 다음과 같이 재구성하고 싶습니다 .

/Folder1/Folder2/output01/0653/3547/0112945601/
/Folder1/Folder2/output02/0653/3547/0112945602/ 
/Folder1/Folder2/output03/0653/3547/0112945603/ 
...
/Folder1/Folder2/output<nn>/0653/3547/01129456<nn>/ 

10개의 하위 폴더가 있는 경우 이 논리에 따르면 10개의 출력 폴더가 필요합니다.

나는 사용하려고

find -maxdepth 5 -type d 

while 루프에 넣었지만 5번째 하위 폴더 만 처리할 수는 없습니다 .

내가 뭘 할 수 있을 것 같아?

답변1

for dir in Folder1/Folder2/output/*/*/*; do
    suffix=${dir:(-2)}
    subdir="$(cut -d '/' -f 4- <<<$dir)"
    newdir="Folder1/Folder2/output${suffix}/${subdir}"
    echo mkdir -p "$newdir"
    echo mv "$dir"/* "$newdir"/
done

연습 실행을 수행한 후 자신에게 적합한 명령을 생성하는 것처럼 보이면 문을 제거하여 echo실제로 파일을 이동하십시오.

답변2

현재 디렉토리에 있다고 가정합니다 Folder1.

#!/bin/bash

# Don't even attempt to do something
# if we're in the wrong place.
cd Folder1/Folder2 || exit 1

# Make the shell remove patterns that aren't matched,
# rather than leaving them as they are.
shopt -s nullglob

for dirpath in output/*/*/*/; do
        if [[ $dirpath =~ output/(.*)/[^/]*(..)/ ]]; then
                # "${BASH_REMATCH[1]}" is something like "0653/3457"
                # "${BASH_REMATCH[2]}" is the 2-character suffix, like "01"

                newdir=output${BASH_REMATCH[2]}/${BASH_REMATCH[1]}
                mkdir -p "$newdir" &&
                mv "$dirpath" "$newdir"
        fi
done

이는 정규식 일치를 사용하여 bash디렉터리 경로 이름 끝에서 숫자 접미사를 선택하고 output이를 사용하여 새 디렉터리 이름을 구성합니다.

이것은 디렉토리 구조를 취합니다

.
`-- Folder1/
    `-- Folder2/
        `-- output/
            `-- 0653/
                `-- 3547/
                    |-- 0112945601/
                    `-- 0112945602/

그리고 그것을

.
`-- Folder1/
    `-- Folder2/
        |-- output/
        |   `-- 0653/
        |       `-- 3547/
        |-- output01/
        |   `-- 0653/
        |       `-- 3547/
        |           `-- 0112945601/
        `-- output02/
            `-- 0653/
                `-- 3547/
                    `-- 0112945602/

Folder1/Folder2/output그런 다음 다음을 사용하여 빈 디렉토리를 삭제할 수 있습니다.

find Folder1/Folder2/output -type d -empty -delete

find또는 비어 있지 않은 디렉토리를 삭제하려고 할 때 표준을 사용하고 오류를 무시하십시오 .rmdir

find Folder1/Folder2/output -depth -type d -exec rmdir {} \; 2>/dev/null

이것은 떠난다

.
`-- Folder1/
    `-- Folder2/
        |-- output01/
        |   `-- 0653/
        |       `-- 3547/
        |           `-- 0112945601/
        `-- output02/
            `-- 0653/
                `-- 3547/
                    `-- 0112945602/

분명히 거기 있을 거야복사먼저 귀하의 데이터입니다.

답변3

#!/usr/bin/env bash
PATH="/folder1/folder2/folder3"
HIERARQUIA=$(/usr/bin/find $PATH/????/????/  -maxdepth 0 -type d | /usr/bin/cut -d "/" -f5-|/usr/bin/sort -s )
OUTPUT=1

for i in $HIERARQUIA
    do
        SUBPASTAS=$(/usr/bin/find $PATH/$i -maxdepth 1 -type d | /usr/bin/cut -d "/" -f7 |/usr/bin/sort -s)
        for a in $SUBPASTAS
            do
                /usr/bin/mkdir -p $PATH/output$OUTPUT/$i$a
                /usr/bin/mv $PATH/$i$a/* $PATH/output$OUTPUT/$i$a
                OUTPUT=$(($OUTPUT +1))              
            done
            OUTPUT=1
    done

나는 이 결과를 찾았고 그 목적에 부합했습니다. 언젠가 비슷한 문제가 발생하는 모든 사람을 위해 여기에 코드가 있습니다.

응답하고 도움을 주신 모든 분들께 감사드립니다.

관련 정보