如何在Bash中压缩所有子文件夹?

17 浏览
0 Comments

如何在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

请问我该如何做到这一点?

0
0 Comments

原因:问题的出现是因为在使用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"参数,我们可以成功压缩所有的子文件夹,而不会再出现之前的错误信息。

希望这篇文章对你有所帮助!

0
0 Comments

问题的原因: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文件将位于每个子目录下。

0