所以我有一个bash脚本,CDS到一个目录,执行命令,然后退出并再次进入一个新的目录:如何将cd压缩到多个目录中(将其命名为目录名称后)?
for d in ./*/ ; do (cd "$d" && somecommand); done
从here。
不幸的是,我不知道如何压缩它所在的目录(也许使用诸如7z之类的东西)。这是一个长镜头,但我想这个命令,它没有工作(我没想到星号取目录的名称...但我希望):
7z a -r *.zip
我不假设有人有任何建议?
所以我有一个bash脚本,CDS到一个目录,执行命令,然后退出并再次进入一个新的目录:如何将cd压缩到多个目录中(将其命名为目录名称后)?
for d in ./*/ ; do (cd "$d" && somecommand); done
从here。
不幸的是,我不知道如何压缩它所在的目录(也许使用诸如7z之类的东西)。这是一个长镜头,但我想这个命令,它没有工作(我没想到星号取目录的名称...但我希望):
7z a -r *.zip
我不假设有人有任何建议?
变量$d
包含目录的名称(除其他事项外):
for d in ./*/ ; do (
cd "$d"
dirname=${d%/} # remove trailing/
dirname=${dirname##*/} # remove everything up to the last/
7z a -r "$dirname".zip
)
done
我假设你7z
命令是正确的。
非常感谢! – SRG3006
也许你正在寻找的东西是这样的:
for d in *; do
test -d "$d" && zip -r "$d.zip" "$d"
done
这将检查其名称不首先在工作目录中的所有文件“” (for d in *
)。对于那些目录(test -d $d
),它将递归地将目录内容作为目录的成员进行压缩。压缩文件保留在原始工作目录(所有压缩目录的父目录)中,但它们可以很容易地放入子目录中。
这也适用,谢谢! – SRG3006
如果你把'*'改成'* /',你可以避免'test',尽管如此,我想你必须做类似于我的答案来提取子字符串。我还建议引用'$ d'的用法。如果你做了这些改变,这将是更好的选择,因为它避免了为每个找到的目录创建一个新的子shell。 –
@TomFenech,是的,我完全选择了'*'而不是'* /',这样就不必在之后修改名称。我认为它更清洁。客观地说,它更简洁。不过,引用的好处在于;我将在这方面编辑我的答案。 –
查找tar和gzip – 123
为什么要在进行压缩之前进入目录? –
你需要在你的subshell中进行7zip调用。你在子shell中,所以每次你退出子shell(每个循环迭代)时,子shell的cd目录都会丢失。 –