여러 개의 서로 다른 하위 폴더를 한 수준 아래로 이동하는 방법은 무엇입니까?

여러 개의 서로 다른 하위 폴더를 한 수준 아래로 이동하는 방법은 무엇입니까?

나는 다음과 같은 구조를 가진 수많은 파일을 가지고 있습니다: /base/에 있는 모든 파일, 2개의 "임의" 문자가 있는 4개의 폴더, 그리고 서로 관련된 일련의 파일.

예:

/base/ab/12/13/37/file1.txt
/base/ab/12/13/37/file2.txt
/base/ab/12/13/37/file3.txt
/base/cd/b8/e2/a1/other1.txt
.... 
/base/cd/b8/e2/a1/other52.txt
/base/af/f3/45/9e/third1.txt
/base/af/f3/45/9e/third2.txt

대부분의 구조를 유지하되 내 파일이 속한 끝에 추가(extra_folder) 폴더를 추가하고 싶습니다. 따라서 위의 내용을 다음과 같이 변경하십시오.

/base/ab/12/13/37/extra_folder/file1.txt
/base/ab/12/13/37/extra_folder/file2.txt
/base/ab/12/13/37/extra_folder/file3.txt
/base/cd/b8/e2/a1/extra_folder/other1.txt

나는 쉘 스크립트와 이동 명령이 필요할 것이라고 예상했습니다.

매우 감사합니다.

답변1

이것이 우리가 시작하는 곳입니다:

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- third1.txt
|               `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                |-- other1.txt
                `-- other52.txt

12 directories, 7 files

먼저 새 디렉터리를 추가합니다.

$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'

우리는 네 번째 수준에서 새 디렉토리를 생성하는 데만 -mindepth 4및 를 사용합니다 . -maxdepth 4그렇지 않은 경우 -mindepth 4더 높은 수준의 새 디렉토리를 얻게 되며, 새 디렉토리가 없으면 경로 이름이 너무 길어서 더 이상 디렉토리를 생성할 수 -maxdepth 4없을 때까지 해당 디렉토리 자체가 새 디렉토리로 채워집니다 .find

디렉토리 는 에서 호출하여 생성 extra_folder됩니다 . 이제 우리는mkdir-exec

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- extra_folder
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- extra_folder
|               |-- third1.txt
|               `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                |-- extra_folder
                |-- other1.txt
                `-- other52.txt

15 directories, 7 files

그런 다음 파일을 아래로 이동합니다.

$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'

이렇게 하면 다섯 번째 수준 디렉터리나 그 아래에 있는 일반 파일을 찾을 수 있습니다 base(최하위 수준에만 파일이 있다고 가정합니다). 그런 다음 발견된 파일이 있는 디렉터리 -execdir(발견된 파일의 기본 이름이 됨) 내에서 명령을 실행하는 데 사용됩니다.mv{}

우리는 마침내 얻습니다

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               `-- extra_folder
|                   |-- file1.txt
|                   |-- file2.txt
|                   `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               `-- extra_folder
|                   |-- third1.txt
|                   `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                `-- extra_folder
                    |-- other1.txt
                    `-- other52.txt

15 directories, 7 files

한 번에:

$ find base -type f \
    -execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'

extra_folder그러면 시작 위치에 관계없이 모든 일반 파일을 찾아서 이름이 지정된 디렉토리로 이동합니다 . 이 명령을 여러 번 실행하면 명령이 점점 더 아래로 이동합니다.

다음과 같은 미니 스크립트가 호출됩니다 -execdir.

[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"

폴더 이름은 , 파일 이름은 $1으로 호출되며 $2, 폴더가 없으면 폴더를 생성한 다음 파일을 그 폴더로 이동합니다.

관련 정보