【问题标题】:Unix: Batch move files from multiple subdirectories up 1 levelUnix:将多个子目录中的文件批量移动上一级
【发布时间】:2014-09-09 08:47:15
【问题描述】:

如何在一个终端命令中将多个子目录中的文件向上移动 1 级?

文件结构:
路径/到/文件/A/remove/image.png
路径/to/files/B/remove/image.png
路径/to/files/C/remove/image.png
路径/到/文件/D/remove/image.png
路径/to/files/E/remove/image.png

所需结构:
路径/到/文件/A/image.png
路径/到/文件/B/image.png
路径/到/文件/C/image.png
路径/到/文件/D/image.png
路径/to/files/E/image.png

有很多目录,上面的每个“字母”目录都包含几个图像。 另外,想删除文件被移动的目录。

【问题讨论】:

  • 为什么需要在一个命令中完成? Return 键是躲闪的吗?
  • 我不明白你的问题...有很多目录和很多文件。我只希望文件在每个子目录中上移一级。一次处理 1 个目录需要很长时间。
  • 您指定了“一个终端命令”,我想知道原因。
  • 我相信我的上一条评论回答了这个问题。任何合理的解决方案都会有所帮助

标签: macos unix terminal directory batch-processing


【解决方案1】:

我有相同的要求(在 Mac 上),但在我的情况下,子目录的名称与原始问题中的名称不同,这使得它有点复杂。这对我有用:

从我运行的“路径/到”文件夹

find .  -mindepth 3 -maxdepth 3 -type f | awk -v sq="'" -F "/" '{print "mv -i " sq $0 sq " " sq  "./" $2 sq}' > moveup.sh

然后

sh moveup.sh

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点。

    这会将所有文件移动到它们的祖父目录:

    $ find path/to/files -type f -exec mv {} $(dirname $(dirname {})) \;
    

    您添加一个-name \*.type 或其他什么,而不是-type f 选项,以便更具体。

    这会删除空目录:

    $ find . -type d -empty -exec rmdir {} \;
    

    (虽然它会产生良性错误,我猜这是因为目录结构已更改,而 find 仍在工作)。

    【讨论】:

    • 所以,这并不完全符合我的要求。这会将所有内容向上移动 2 个目录...如果您看到上面的示例目录...,此方法将所有文件移动到 path/to/files/ 我希望文件保留在它们各自的目录中,但要移出多余的附加子目录。如果我在每个单独的目录上运行它,这个答案会起作用,但我的问题是如何在 path/to/files/ 中执行一批所有目录
    【解决方案3】:

    我找到了我的问题的解决方案...

    使用原始问题中的示例目录,我使用了以下命令:

    for a in $(find path/to/files -maxdepth 1 -type d); do mv $a/remove/* $a/; rmdir $a/remove; done
    

    “remove”是我想将文件移出每个目录的子目录的名称。

    答案居然在这里找到:
    https://serverfault.com/questions/405146/how-to-mass-move-files-one-directory-up

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 2019-01-06
      • 2013-08-19
      • 2021-06-24
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多