2016-01-08 25 views
0

所以我有一个bash脚本,CDS到一个目录,执行命令,然后退出并再次进入一个新的目录:如何将cd压缩到多个目录中(将其命名为目录名称后)?

for d in ./*/ ; do (cd "$d" && somecommand); done 

here

不幸的是,我不知道如何压缩它所在的目录(也许使用诸如7z之类的东西)。这是一个长镜头,但我想这个命令,它没有工作(我没想到星号取目录的名称...但我希望):

7z a -r *.zip 

我不假设有人有任何建议?

+0

查找tar和gzip – 123

+1

为什么要在进行压缩之前进入目录? –

+0

你需要在你的subshel​​l中进行7zip调用。你在子shell中,所以每次你退出子shell(每个循环迭代)时,子shell的cd目录都会丢失。 –

回答

2

变量$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命令是正确的。

+0

非常感谢! – SRG3006

2

也许你正在寻找的东西是这样的:

for d in *; do 
    test -d "$d" && zip -r "$d.zip" "$d" 
done 

这将检查其名称不首先在工作目录中的所有文件“” (for d in *)。对于那些目录(test -d $d),它将递归地将目录内容作为目录的成员进行压缩。压缩文件保留在原始工作目录(所有压缩目录的父目录)中,但它们可以很容易地放入子目录中。

+0

这也适用,谢谢! – SRG3006

+0

如果你把'*'改成'* /',你可以避免'test',尽管如此,我想你必须做类似于我的答案来提取子字符串。我还建议引用'$ d'的用法。如果你做了这些改变,这将是更好的选择,因为它避免了为每个找到的目录创建一个新的子shell。 –

+1

@TomFenech,是的,我完全选择了'*'而不是'* /',这样就不必在之后修改名称。我认为它更清洁。客观地说,它更简洁。不过,引用的好处在于;我将在这方面编辑我的答案。 –

相关问题