使用文件移动子文件夹的命令,保留原始结构

时间:2015-07-28 11:33:52

标签: linux shell

我有一个父/ 文件夹,里面有几个子文件夹。结构:

/parent/
    /subfolder_1/
        - file_1.txt
        - file_2.txt
    /subfolder_2/
        - file_3.txt
        - file_4.txt

现在,我需要递归移动 父/ 文件夹的内容到空 parent_tmp / 目录。事实是,我需要将原始文件夹结构保留在父/

搬家后的预期结果:

    /parent/
        /subfolder_1/
            (empty)
        /subfolder_2/
            (empty)


    /parent_tmp/
        /subfolder_1/
            - file_1.txt
            - file_2.txt
        /subfolder_2/
            - file_3.txt
            - file_4.txt

通常,我只会做

mv parent/* parent_tmp

但是,这当然会永久地移动子文件夹。

有没有办法调整mv命令以保留源目录的原始结构?

注意:

我意识到我可以,例如将父级/ 复制到 parent_tmp ,然后删除父级/ 子文件夹中的文件。这是我的计划B.

4 个答案:

答案 0 :(得分:2)

您可以复制文件

cp -r parent/* parent_tmp/

或创建硬链接(大文件应该快得多)

cp -l -r parent/* parent_tmp/

然后删除原始文件

find parent -type f -delete

同时保持目录结构。

答案 1 :(得分:2)

您可以使用findparent导演父母的parent_tmp

find parent -type f -exec bash -c 'mkdir -p "parent_tmp/${1%/*}" && 
      mv "$1" "parent_tmp/${1%/*}"' - {} \;

答案 2 :(得分:1)

压缩父文件夹的内容并将其解压缩到目标文件夹中。

答案 3 :(得分:1)

快速和肮脏:

我认为你不会在mv命令中找到一个工具或选项来做你想做的事情,但你应该能够通过使用find来实现预期目标:

cd parent && while read file ; do dirname="$(dirname "$file")" ; mkdir -p ../parent_tmp/"$dirname"/; mv "$file" "../parent_tmp/"${file#}"" ; done < <( find . -type f ) && cd -

<强>功能

如果您经常使用它,那么您可以将上面的内容添加到您的〜/ .basrc中(附加到文件的末尾):

alias mvkp=moveandkeep

moveandkeep() {

    cd "$1"
    while read file ;
    do dirname="$(dirname "$file")" ;
        mkdir -p "$2"/"${dirname#}";
        mv "$file" ""$2"/"${file#}"";
    done < <(find . -type f)
    cd -

}

现在您只需执行以下操作:(所需目录的完整路径)

mvkp /home/user/parent /home/user/parent_tmp