![如何将包含字符串的所有子文件夹移动到新目录,包括其超级目录](https://linux22.com/image/203201/%E5%A6%82%E4%BD%95%E5%B0%86%E5%8C%85%E5%90%AB%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%89%80%E6%9C%89%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E7%A7%BB%E5%8A%A8%E5%88%B0%E6%96%B0%E7%9B%AE%E5%BD%95%EF%BC%8C%E5%8C%85%E6%8B%AC%E5%85%B6%E8%B6%85%E7%BA%A7%E7%9B%AE%E5%BD%95.png)
我一直在努力解决这个问题。这是我的文件的示例:
~/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
这会:
- 查找所有名为“2022-03-04”的目录。
- 根据需要在存档位置重新创建目录树。
- 将‘2022-03-04’的内容移动到对应的归档目录,并删除原来的‘2022-03-04’目录。
(标准免责声明,如果文件名包含奇怪的字符,这将中断)