如何使用通配符将一个目录的所有内容移动到新目录?

How to move all contents of one directory to new directory using wildcard?

我刚刚更新了我网站的文件结构,并试图找到一种将所有文件移动到新设置中的快速方法。旧设置是:

/CO/001/2022/02-18
/CO/002/2022/02-18
...
/CO/999/2022/02-18

目前我所有的图像都在最后一个 02-18 文件夹中。我刚刚更新了一些东西,新的目录列表是:

/CO/001/2022-02-18
/CO/002/2022-02-18
...
/CO/999/2022-02-18

问题是,我想将旧文件结构文件夹 (CO//2022/02-18) 中的所有内容移动到新文件夹 (CO// 2022-02-18) 而无需手动浏览所有 999 个旧文件夹并将内容转储到新文件夹中。

我已经尝试过以下命令:

mv */2022/02-19 */2022-02-19

但这似乎并没有按预期工作,并给了我一个“不会覆盖刚刚创建的”错误,并试图将文件放入错误的文件夹(001/2022/02-18 中的图像是试图放入 002/2022-02-18 而不是 001/2022-02-18)

我们不能使用通配符扩展,因为

mv */2022/02-18 */2022-02-18

将展开为:

mv 001/2022/02-18 002/2022/02-18 ... 999/2022/02-18 "*/2022-02-18"

这不会像您预期的那样工作。 你能试试吗:

#!/bin/bash

for d in /CO/*/2022/02-18/; do          # loop over the old directories
    if [[ -d $d ]]; then                # make sure $d is a dirname
        new=$(sed -E 's#([0-9]{4})/([0-9]{2}-[0-9]{2}/)$#-#' <<< "$d")
                                        # modify "*/2022/02-18/" to "*/2022-02-18/"
        echo mv -- "$d" "$new"          # rename the dirname
        old=${d%/}; old=${old%/*}       # extract the parent directory name "*/2022"
        echo rmdir -- "$old"            # remove the empty parent directory
    fi
done

它只是打印将作为干 运行 执行的命令。如果结果 看起来不错,在 mv 之前删除 echo 并在 rmdir 之后再次删除 运行。 (请注意 dry 运行 将输出数千行。您不必检查所有 线。只看几行就够了。)