如何压缩Bash中的所有子文件夹?
How to compress all subfolder in Bash?
我是 Bash 的新手,正在尝试压缩子文件夹,但它不起作用。
|-- Folder
| |-- SubFolder1
| |-- SubFolder2
| |-- SubFolder3
在 tar
命令之后
|-- Folder
| |-- SubFolder1
| |-- SubFolder2
| |-- SubFolder3
| |-- SubFolder1.tar.gz
| |-- SubFolder2.tar.gz
| |-- SubFolder3.tar.gz
脚本:
#!/bin/bash
DEST=/home/pc/Desktop
for folder in $DEST
do
tar -czvf "$folder.tar.gz" $DEST
#rm -rf "$folder"
done
我该怎么做?
你的 for
循环需要被告知迭代什么。您只是告诉它顶级目录:
...
DEST=/home/pc/Desktop
for folder in $DEST
...
这需要包含一个通配符,以便 Bash 知道您想要它下面的所有目录:
...
DEST=/home/pc/Desktop
for folder in "$DEST"/*
...
例子
$ mkdir -p Folder/SubFolder{1,2,3}
$ tree Folder/
Folder/
├── SubFolder1
├── SubFolder2
└── SubFolder3
3 directories, 0 files
您的命令:
$ for i in Folder/;do echo "$i";done
Folder/
同星(*
):
$ for i in Folder/*;do echo "$i";done
Folder/SubFolder1
Folder/SubFolder2
Folder/SubFolder3
使用查找
您可以像这样使用 find
而不是使用 for
生成目录到 tar
:
$ find Folder/ -mindepth 1 -maxdepth 1 -type d | xargs -I {} tar zcvf {}.tar.gz {}
Folder/SubFolder3/
Folder/SubFolder1/
Folder/SubFolder2/
$ ll Folder/
total 24
drwxr-xr-x 2 root root 4096 Sep 4 07:30 SubFolder1
-rw-r--r-- 1 root root 122 Sep 4 08:01 SubFolder1.tar.gz
drwxr-xr-x 2 root root 4096 Sep 4 07:30 SubFolder2
-rw-r--r-- 1 root root 122 Sep 4 08:01 SubFolder2.tar.gz
drwxr-xr-x 2 root root 4096 Sep 4 07:30 SubFolder3
-rw-r--r-- 1 root root 122 Sep 4 08:01 SubFolder3.tar.gz
请查看代码块中的注释:
#!/bin/bash
DEST=/whatever/whatever/*/ #Note the ending "/" let you get only dirs
for folder in $DEST
do
#the basename gets the name of current sub-dir
#instead of fullpath
tar -czvf "$(basename "$folder").tar.gz" "$folder"
done
您可能会收到类似于 "tar:removing leading "/" 或斜杠..." 的错误消息,我记不起确切的措辞了。您可以将 -P
添加到 tar 以忽略它。
我是 Bash 的新手,正在尝试压缩子文件夹,但它不起作用。
|-- Folder
| |-- SubFolder1
| |-- SubFolder2
| |-- SubFolder3
在 tar
命令之后
|-- Folder
| |-- SubFolder1
| |-- SubFolder2
| |-- SubFolder3
| |-- SubFolder1.tar.gz
| |-- SubFolder2.tar.gz
| |-- SubFolder3.tar.gz
脚本:
#!/bin/bash
DEST=/home/pc/Desktop
for folder in $DEST
do
tar -czvf "$folder.tar.gz" $DEST
#rm -rf "$folder"
done
我该怎么做?
你的 for
循环需要被告知迭代什么。您只是告诉它顶级目录:
...
DEST=/home/pc/Desktop
for folder in $DEST
...
这需要包含一个通配符,以便 Bash 知道您想要它下面的所有目录:
...
DEST=/home/pc/Desktop
for folder in "$DEST"/*
...
例子
$ mkdir -p Folder/SubFolder{1,2,3}
$ tree Folder/
Folder/
├── SubFolder1
├── SubFolder2
└── SubFolder3
3 directories, 0 files
您的命令:
$ for i in Folder/;do echo "$i";done
Folder/
同星(*
):
$ for i in Folder/*;do echo "$i";done
Folder/SubFolder1
Folder/SubFolder2
Folder/SubFolder3
使用查找
您可以像这样使用 find
而不是使用 for
生成目录到 tar
:
$ find Folder/ -mindepth 1 -maxdepth 1 -type d | xargs -I {} tar zcvf {}.tar.gz {}
Folder/SubFolder3/
Folder/SubFolder1/
Folder/SubFolder2/
$ ll Folder/
total 24
drwxr-xr-x 2 root root 4096 Sep 4 07:30 SubFolder1
-rw-r--r-- 1 root root 122 Sep 4 08:01 SubFolder1.tar.gz
drwxr-xr-x 2 root root 4096 Sep 4 07:30 SubFolder2
-rw-r--r-- 1 root root 122 Sep 4 08:01 SubFolder2.tar.gz
drwxr-xr-x 2 root root 4096 Sep 4 07:30 SubFolder3
-rw-r--r-- 1 root root 122 Sep 4 08:01 SubFolder3.tar.gz
请查看代码块中的注释:
#!/bin/bash
DEST=/whatever/whatever/*/ #Note the ending "/" let you get only dirs
for folder in $DEST
do
#the basename gets the name of current sub-dir
#instead of fullpath
tar -czvf "$(basename "$folder").tar.gz" "$folder"
done
您可能会收到类似于 "tar:removing leading "/" 或斜杠..." 的错误消息,我记不起确切的措辞了。您可以将 -P
添加到 tar 以忽略它。