【问题标题】:Command for moving subfolders with files, with keeping the original structure用于移动带有文件的子文件夹的命令,并保持原始结构
【发布时间】:2015-07-28 23:15:17
【问题描述】:

我有一个 parent/ 文件夹,其中有几个子文件夹。结构:

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

现在,我需要递归地将 parent/ 文件夹的内容移动到空的 parent_tmp/ 目录。问题是,我需要将原始文件夹结构保留在 parent/ 中。

搬家后的预期结果:

    /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/ 复制到 parent_tmp,然后删除 parent/ 子文件夹中的文件。这对我来说是 B 计划。

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    您可以使用来自parentparent_tmp 目录的父级的find

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

    【讨论】:

      【解决方案2】:

      你可以复制文件

      cp -r parent/* parent_tmp/
      

      或创建硬链接(对于大文件应该会快很多)

      cp -l -r parent/* parent_tmp/
      

      然后删除原来的文件

      find parent -type f -delete
      

      同时保持目录结构。

      【讨论】:

      • 如果目录包含大文件,此解决方案会占用大量磁盘空间。更好的解决方案是仅复制目录,然后移动所有文件。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        又快又脏:

        我不认为你会在 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
        

        【讨论】:

        • 这里的“来源”是什么?引用所有变量以容纳带有空格的目录。里面有好主意。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多