如何将包含字符串的所有子文件夹移动到新目录,包括其超级目录

如何将包含字符串的所有子文件夹移动到新目录,包括其超级目录

我一直在努力解决这个问题。这是我的文件的示例:

~/download/Video/CE/
~/download/Video/CE/153
~/download/Video/CE/153/2022-03-04
~/download/Video/CE/153/2022-03-05
~/download/Video/CE/281
~/download/Video/CE/281/2022-03-04
~/download/Video/CE/281/2022-03-05
~/download/Video/GA/
~/download/Video/GA/154
~/download/Video/GA/154/2022-03-04
~/download/Video/GA/154/2022-03-05
~/download/Video/GA/615
~/download/Video/GA/615/2022-03-04
~/download/Video/GA/615/2022-03-05
...etc

/download/Video 中有几十个文件夹,/download/video/*/ 中有几百个文件夹

我正在尝试将包含“2022-03-04”的所有文件夹及其所有内容移动到新目录中。我想要的结果是:

/mnt/d/archive/Video/CE/153/2022-03-04
/mnt/d/archive/Video/CE/281/2022-03-04
/mnt/d/archive/Video/GA/154/2022-03-04
...etc

我尝试了各种方法,但我最大的问题是我不能简单地将视频文件夹移动到 /mnt/d/archive,因为我想将 2022-03-05 文件夹(和超级目录)保留在主驱动器上。

这是我到目前为止所尝试过的:

cd ~/download/Video/CE; for subdir in *; do mv $subdir/2022-03-04 /mnt/d/archive/Video/CE/$subdir/; done;

^ 然后只需复制并粘贴 GA 的代码以及 /Video/ 中的所有其他子目录

这创建了以下内容:

/mnt/d/archive/Video/CE/153/file.mp4
/mnt/d/archive/Video/CE/153/file2.mp4
/mnt/d/archive/Video/CE/281/file.mp4
...etc

这很棒,只是它不复制“2022-03-04”文件夹本身。我需要 2022-03-04 文件夹。所以我尝试了这个代码:

cd ~/download/Video/CE; for subdir in *; do mv $subdir/2022-03-04 ~/mnt/d/archive/Video/CE/$subdir/2022-03-04; done;

然而,现在我遇到了另一个问题。这次没有复制任何文件夹或文件。我刚刚收到“没有这样的文件或目录”错误。

有任何想法吗?

答案1

我的选择是 tar 因为它很快。

(cd ~/download/Video && find . -type d -name 2022-03-04 | tar -T - -cpf - --remove-files | tar -C "/mnt/d/archive/Video/" -xpf -)

答案2

如果我正确理解你的问题,这样的事情应该有效:

cd ~/download/Video
for i in $(find * -type d -name '2022-03-04'); do
    mkdir -p /mnt/d/archive/Video/"$i"
    mv "$i"/* /mnt/d/archive/Video/"$i" && rm -r "$i"
done

这会:

  1. 查找所有名为“2022-03-04”的目录。
  2. 根据需要在存档位置重新创建目录树。
  3. 将‘2022-03-04’的内容移动到对应的归档目录,并删除原来的‘2022-03-04’目录。

(标准免责声明,如果文件名包含奇怪的字符,这将中断)

相关内容