디렉터리를 자체 하위 디렉터리로 이동하거나 복사합니다.

디렉터리를 자체 하위 디렉터리로 이동하거나 복사합니다.

다음 디렉토리가 있습니다.

├── test
│   └── third2
│       ├── sec2
│       │   ├── sec
│       │   │   └── Backup
│       │   │       └── third3
│       │   │           └── sec2
│       │   │               └── sec
│       │   │                   └── Backup
│       │   ├── sec5
│       │   ├── third
│       │   └── third3
│       │       └── sec2
│       │           ├── sec
│       │           ├── sec5
│       │           └── third
│       └── sec3
└── test.sh

"test/third2"디렉토리를 하위 디렉토리로 이동하고 싶습니다 "test/third2/sec2".

따라서 다음과 같습니다.

├── test
│   └── sec2
│       ├── third2
│       │   ├── sec
│       │   │   └── Backup
│       │   │       └── third3
│       │   │           └── sec2
│       │   │               └── sec
│       │   │                   └── Backup
│       │   ├── sec5
│       │   ├── third
│       │   └── third3
│       │       └── sec2
│       │           ├── sec
│       │           ├── sec5
│       │           └── third
│       └── sec3
└── test.sh

이렇게 하면 다음과 같은 오류 메시지가 나타납니다.

mv: cannot move 'third2' to a subdirectory of itself, 'third2/sec2/third2'

test.sh 코드:

cd test/
#mkdir third2/sec3
#mkdir test3
for f in *; do
        if [ -d "$f" ]; then
        cd "$f"
        echo "cd directories $f"
                for i in *; do
                        if [ -d "$i" ]; then
                                echo "Dir $i"
                                cd -
                                mv "$f" "$f"/"$i"
                        fi

                done
        fi
done

어떻게 해야 하나요? 저는 Unix를 처음 사용합니다.

Third2의 상위 디렉터리는 sec2여야 하고 sec 2의 상위 디렉터리는 test여야 합니다.

편집: 새로운 예 사용: 답변해 주셔서 감사합니다. 단일 디렉터리의 이름은 변경할 수 있지만 여러 디렉터리는 변경할 수 없습니다. 올바르게 수행되지 않았습니다.

다음 디렉토리가 있습니다.

├── songs
│   ├── Song 1
│   │   └── 1950
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       ├── D.txt
│   │       ├── E.txt
│   │       ├── F.txt
│   │       ├── G.txt
│   │       └── H.txt
│   ├── Song 2
│   │   ├── 1920
│   │   │   ├── A.txt
│   │   │   ├── B.txt
│   │   │   ├── C.txt
│   │   │   └── D.txt
│   │   └── 2000
│   │       ├── A.txt
│   │       └── B.txt
│   ├── Song 3
│   │   └── 2015
│   │       ├── A.txt
│   │       ├── B.txt
│   │       └── C.txt
│   ├── Song 4
│   │   └── 2013
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       └── D.txt
│   ├── Song 5
│   │   ├── 2012
│   │   │   ├── A.txt
│   │   │   └── B.txt
│   │   └── 2019
│   │       ├── A.txt
│   │       └── B.txt
│   └── Song 6
│       ├── 2011
│       │   └── A.txt
│       └── 2012
│           └── A.txt
├── songs.txt

다음 코드를 사용하여 songs.sh를 실행한 후:

cd songs/


for i in *; do
        if [ -d "$i" ]; then
                #echo "i == $i"
                cd "$i"
                for k in *; do
                        if [ -d "$k" ]; then
                                echo "test"
                                mv -f  "$k" "$i"
                        fi
                done
                cd ..
        mv -f "$i" "$k"
        fi
done
cd ..

나는 다음과 같은 결과를 얻습니다.

── songs
│   ├── 1950
│   │   └── Song 1
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       ├── D.txt
│   │       ├── E.txt
│   │       ├── F.txt
│   │       ├── G.txt
│   │       └── H.txt
│   ├── 2000
│   │   └── Song 2
│   │       ├── 2000
│   │       │   ├── A.txt
│   │       │   └── B.txt
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       └── D.txt
│   ├── 2012
│   │   └── Song 6
│   │       ├── 2012
│   │       │   └── A.txt
│   │       └── A.txt
│   ├── 2013
│   │   └── Song 4
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       └── D.txt
│   ├── 2015
│   │   └── Song 3
│   │       ├── A.txt
│   │       ├── B.txt
│   │       └── C.txt
│   └── 2019
│       └── Song 5
│           ├── 2019
│           │   ├── A.txt
│           │   └── B.txt
│           ├── A.txt
│           └── B.txt
├── songs.txt

나는 그것을 갖고 싶다. :

├── songs
│   ├── 1920
│   │   └── Song 2
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       └── D.txt
│   ├── 1950
│   │   └── Song 1
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       ├── D.txt
│   │       ├── E.txt
│   │       ├── F.txt
│   │       ├── G.txt
│   │       └── H.txt
│   ├── 2000
│   │   └── Song 2
│   │       ├── A.txt
│   │       └── B.txt
│   ├── 2011
│   │   └── Song 6
│   │       └── A.txt
│   ├── 2012
│   │   ├── Song 5
│   │   │   ├── A.txt
│   │   │   └── B.txt
│   │   └── Song 6
│   │       └── A.txt
│   ├── 2013
│   │   └── Song 4
│   │       ├── A.txt
│   │       ├── B.txt
│   │       ├── C.txt
│   │       └── D.txt
│   ├── 2015
│   │   └── Song 3
│   │       ├── A.txt
│   │       ├── B.txt
│   │       └── C.txt
│   └── 2019
│       └── Song 5
│           ├── A.txt
│           └── B.txt
├── songs.txt

답변1

몇 가지 디렉토리의 이름만 변경하려는 것 같습니다.

mv test/third2/sec2 test/third2/third2
mv test/third2 test/sec2

답변2

편집 2:마지막 업데이트 이후 이는 매우 구체적인 사례입니다. 이 문제를 해결하는 방법은 여러 가지가 있습니다. 다음은 간단하고 구체적인 방법입니다.

#!/bin/bash
#cd songs/

for folder in */*/ ; # list all subfolders of current folder
do
    song=$(dirname "$folder") # extract song
    year=$(basename "$folder") # and year
    if [ ! -d "$year" ]; then #check if year folder exists
        mkdir "$year" #if not, create it
    fi
    mv "$folder" "$year/$song" #move and rename subfolder
    rmdir "$song" #will throw error if not empty, it's dirty but quick
done

편집 1: 업데이트 내용을 보니 폴더 이름을 바꾸고 싶다고 하신 것 같은데요? 이 경우 다음 섹션만 업데이트하면 됩니다.

        for i in *; do
            if [ -d "$i" ]; then
                echo "dir $i"
                mv "$i" "$f"
                cd -
                mv "$f" "$i"
            fi

원래

첫째, 디렉터리를 해당 하위 디렉터리로 이동할 수 없습니다. 그렇다면 해당 하위 디렉터리의 상위 디렉터리는 무엇입니까?

sec2를 상위로 전송한 다음 Third2로 전송해야 합니다 rmdir.

#!/bin/bash

for f in *; do
    if [ -d "$f" ]; then
        cd "$f"
        echo "cd dir $f"
        for i in *; do
            if [ -d "$i" ]; then
                echo "dir $i"
                mv "$i" ".."
                cd -
                rmdir "$f"
            fi
        done
    fi
done

$f비어 있지 않으면 오류가 발생합니다.

답변3

당신이 지금 어디에 있고 어디에 있고 싶은지 살펴보십시오. 다음을 수행해야 합니다.

mv -T test/third2 test/sec2
mv -T test/sec2/sec2 test/sec2/third2

관련 정보