我有一个如下所示的文件夹结构:
0/1/2,数字从{0..9}开始
我尝试编写一个 bash shell 脚本,以便可以像这样压缩每个文件夹:
#!/bin/bash
for i in {0..9};
do
cd $i
for j in {0..9};
do
cd $j
for k in {0..9};
do
tar -czvf $i$j$k.tar.gz $k;
done
done
done
它似乎可以为 .tar.gz 文件创建名称,但它不会遍历目录结构来为文件夹内的每个文件夹创建它们。
我不能 100% 确定我在使用该脚本时做错了什么。
我想要它做的是转到 0/0/,然后为文件夹 {0..9} 创建 .tar.gz 文件。
然后转到 0/1/ 并重复此操作。
然后转到 0/2/ 并再次执行,等等。
直到所有文件夹都循环完毕,并创建了.tar.gz 文件。
它似乎只是在 0/0/ 中说并一遍又一遍地压缩相同的文件,并且它不会移动到下一个文件夹。
任何帮助是极大的赞赏。
(免责声明:我既不是程序员也不是开发人员,所以这对我来说是一个新领域。)
(背景:这是为了备份我的 Photoprism 数据存储(因为它有大约 250 万张照片,占用了大约 1.6 TB 的空间)。我尝试将其直接发送到 LTO-8 磁带,我猜是因为有太多小文件,LTFS 遇到了内存不足异常错误,以至于当我弹出磁带并尝试将其重新加载时,它会因为上述内存不足错误而自动将磁带吐出来;但这是另一个问题。所以我想如果我压缩文件,那么 LTFS 处理的文件就会更少,因此;这应该有助于修复 LTFS/LTO-8 磁带驱动器错误。)
谢谢。
cd
不要使用 ,而应使用-C
选项tar
:类似于(未经测试):
我添加了一个
[ -d ... ]
测试,以防其中一些目录不存在。注意:方便的是,文件是在当前目录中创建的,而不是在使用 ! 切换到
.tar.gz
的目录中创建的。因此,您可以将它们全部放在一个地方。tar
-C
TXR Lisp中的解决方案:
让字符串生成生成数字。用 将它们解构为变量
match
;然后相同的核心逻辑:ijk 目录是否存在;如果存在,则告诉tar
切换到 i/j,从 k 中创建 ijk 档案。没有这些
match
东西的替代方案;each-prod
我们可以压缩嵌套循环:你的脚本从
/start
开始cd 0
/start/0
,然后你降落在cd 0
/start/0/0
,然后你降落在cd 1
,之后你落在/start/0/0/1
,不是/start/0/1
,那么cd 2
,由于没有,因此可能会失败/start/0/0/1/2
。如果必须使用
bash
,我会这样做:笔记:
(...)
一个子 shell,因此cd
只会更改该子 shell 的当前目录&&
我们就不会继续cd
CDPATH=
出现了什么情况,可能会让你降落到完全不同的地方。CDPATH
[0123456789]
) 而不是 zsh 样式的{0..9}
括号扩展,因此它只扩展到实际存在的目录。/
(我们随后用${j%/}
, 或${i//\/}
与其他/
s 一起去除)以限制目录的通配。