将目录移动或复制到其自身的子目录

将目录移动或复制到其自身的子目录

我有以下目录:

├── 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 转移到父级,然后转移到rmdirThird2。

#!/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

相关内容