AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1001937
Accepted
Jimmy
Jimmy
Asked: 2020-02-06 11:27:29 +0800 CST2020-02-06 11:27:29 +0800 CST 2020-02-06 11:27:29 +0800 CST

根据特定条件将文件从一个文件夹移动到另一个文件夹

  • 772

我有成千上万的照片文件夹。无论出于何种原因,他们在导出时创建了几个这样的场景:

2019/01/01
2019/01/01 #2

如何编写可以自动移动文件的 linux 命令(理想情况下可以在 Mac 上运行)

from 
2019/01/01 #2 
to 
2019/01/01

任何帮助,将不胜感激。这需要适用于任何日期并合并内容。我苦苦挣扎的地方是我无法理解如何在没有 # 的情况下将目录作为原始格式

for dir in *#2/*; do mv "$dir"/* "${dir}"; done
bash terminal rename
  • 2 2 个回答
  • 851 Views

2 个回答

  • Voted
  1. SmallClanger
    2020-02-09T14:02:32+08:002020-02-09T14:02:32+08:00

    在尝试此操作之前备份您的文件。这可能是破坏性的...

    部分问题是for在遍历名称中包含一些空格的文件夹时使用。您最终会得到一个不一致的列表,因为空格和回车都是字段分隔符。您只需设置IFS回车即可。(您可以使用find -exec直接处理文件系统条目,但是在使用嵌套通配符时会变得混乱)

    这应该可以完成工作,但要注意移动的文件将覆盖目标文件夹中的匹配文件。从上面的根文件夹运行它。

    # Set IFS to carriage return only.
    IFS='
    '
    # Find all the matching folders and move the .jpg files out of them to the sibling folder.
    for a in $(find . -type d -name *#*); do b=${a::-3}; mv $a/*.jpg $b/; rmdir $a; done
    

    做了一些假设: - 您描述的结构是年/月/日子文件夹。(如果文件夹名称包含\它会变得更丑) - 你只有一些带有#2后缀的文件夹 - 一旦你将文件移出,你想删除 #2 文件夹。

    请参阅此处了解如何在 bash 中使用字符串做更多奇怪的事情......

    • 1
  2. Best Answer
    Freddy
    2020-02-09T15:54:34+08:002020-02-09T15:54:34+08:00

    使用find和-exec:

    find . -type d -name "* #*" -exec bash -O nullglob -c '
      for dir; do
        otherdir=${dir/ #*}
        if [ -d "$otherdir" ]; then
          for file in "$dir"/*; do
            mv -vi "$file" "$otherdir"
          done
          rmdir "$dir" && echo "deleted directory $dir"
        else
          mv -v "$dir" "$otherdir"
        fi
      done
    ' bash {} +
    

    如果后一个目录存在,这会将所有文件从 eg 移动2019/01/01 #2到2019/01/01(如果不存在,#则重命名带有 的文件夹)。如果2019/01/01 #2其他文件夹中已经存在文件,它会请求移动文件的权限。
    移动操作完成后,它会尝试删除(现在为空的)文件夹。所有移动/删除操作都处于详细模式。

    与 for循环nullglob结合使用可确保"$dir"/*在目录已经为空时不返回任何文件。

    • 1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve