如何在Bash中压缩所有子文件夹?
如何在Bash中压缩所有子文件夹?
我对Bash不熟悉,正在尝试压缩子文件夹,但没有成功。
|-- 文件夹 | |-- 子文件夹1 | |-- 子文件夹2 | |-- 子文件夹3
在tar
命令之后
|-- 文件夹 | |-- 子文件夹1 | |-- 子文件夹2 | |-- 子文件夹3 | |-- 子文件夹1.tar.gz | |-- 子文件夹2.tar.gz | |-- 子文件夹3.tar.gz
脚本:
#!/bin/bash DEST=/home/pc/Desktop for folder in $DEST do tar -czvf "$folder.tar.gz" $DEST #rm -rf "$folder" done
请问我该如何做到这一点?
原因:问题的出现是因为在使用tar命令进行压缩时,可能会出现类似"tar:removing leading "/" or slash..."的错误信息。
解决方法:可以在tar命令中加入"-P"参数来忽略这个错误。
以下是完整的
在Bash中如何压缩所有子文件夹?
有时候我们需要将一个目录下的所有子文件夹压缩成一个文件,那么在Bash中该如何实现呢?
下面是一段Bash脚本的代码:
#!/bin/bash DEST=/whatever/whatever/*/ #注意最后的"/"只会获取目录 for folder in $DEST do #basename获取当前子目录的名称,而不是全路径 tar -czvf "$(basename "$folder").tar.gz" "$folder" done
在上述代码中,我们使用了tar命令来进行压缩操作。但是有时候会出现类似"tar:removing leading "/" or slash..."的错误信息,具体的错误信息可能会有所不同。
为了解决这个问题,我们可以在tar命令中加入"-P"参数,这样就可以忽略这个错误。修改后的代码如下:
#!/bin/bash DEST=/whatever/whatever/*/ #注意最后的"/"只会获取目录 for folder in $DEST do #basename获取当前子目录的名称,而不是全路径 tar -czvf -P "$(basename "$folder").tar.gz" "$folder" done
通过添加"-P"参数,我们可以成功压缩所有的子文件夹,而不会再出现之前的错误信息。
希望这篇文章对你有所帮助!
问题的原因:for循环需要告诉它要迭代的内容,而代码中只是告诉了顶层目录,需要使用通配符来告诉Bash你想要迭代的所有子目录。
解决方法:将目录变量中的路径改为使用通配符的形式,以便Bash知道你想要迭代的目录。
示例:
DEST=/home/pc/Desktop for folder in "$DEST"/*
使用通配符的命令:
$ for i in Folder/*;do echo "$i";done Folder/SubFolder1 Folder/SubFolder2 Folder/SubFolder3
使用find命令的解决方法:
$ find Folder/ -mindepth 1 -maxdepth 1 -type d | xargs -I {} tar zcvf {}.tar.gz {}
这样做可以避免使用for循环来生成要压缩的目录列表,而是使用find命令来完成。最后使用xargs命令将目录名传递给tar命令来进行压缩。
注意:在使用tar命令时,需要修改命令,否则创建的tar.gz文件将位于每个子目录下。