谈一谈关于shell编程中的文件测试
Shell编程有时处理一个对象时,需要我们对对象进行测试。
只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错。
这个测试的对象可以是文件、字符串、数字等等。
下面我们来简单的看一下对于文件的测试。
1、 文件测试
2024年07月20日
谈一谈关于shell编程中的文件测试
Shell编程有时处理一个对象时,需要我们对对象进行测试。
只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错。
这个测试的对象可以是文件、字符串、数字等等。
下面我们来简单的看一下对于文件的测试。
1、 文件测试
2024年07月20日
文件压缩和解压缩:Shell脚本可以使用压缩工具(如gzip和tar)来进行文件或目录的压缩和解压缩
#!/bin/bash
# 压缩文件
gzip file.txt
# 压缩目录
tar -czf archive.tar.gz directory/
# 解压缩文件
gzip -d file.txt.gz
# 解压缩目录
tar -xzf archive.tar.gz
2024年07月20日
// @Title 文件工具方法
// @Description 文件操作相关工具方法
// @Author xutao
// @Update 2020/04/01
package util
import (
"fmt"
"os/exec"
"regexp"
"strconv"
"strings"
)
// 以下合并操作适用于linux平台
const (
// MergeFileCMD : 通过shell合并分块文件
MergeFileCMD = `
#!/bin/bash
# 需要进行合并的分片所在的目录
chunkDir=$1
# 合并后的文件的完成路径(目录+文件名)
mergePath=$2
echo "分块合并,输入目录: " $chunkDir
if [ ! -f $mergePath ]; then
echo "$mergePath not exist"
else
rm -f $mergePath
fi
for chunk in $(ls $chunkDir | sort -n)
do
cat $chunkDir/${chunk} >> ${mergePath}
done
echo "合并完成,输出:" mergePath
`
// FileSha1CMD : 计算文件sha1值
FileSha1CMD = `
#!/bin/bash
sha1sum $1 | awk '{print $1}'
`
// FileSizeCMD : 计算文件大小
FileSizeCMD = `
#!/bin/bash
ls -l $1 | awk '{print $5}'
`
// FileChunksDelCMD : 删除文件分块
FileChunksDelCMD = `
#!/bin/bash
chunkDir="/data/chunks/"
targetDir=$1
# 增加条件判断,避免误删 (指定的路径包含且不等于chunkDir)
if [[ $targetDir =~ $chunkDir ]] && [[ $targetDir != $chunkDir ]]; then
rm -rf $targetDir
fi
`
)
// RemovePathByShell : 通过调用shell来删除制定目录
// @return bool: 合并成功将返回true, 否则返回false
func RemovePathByShell(destPath string) bool {
cmdStr := strings.Replace(FileChunksDelCMD, "$1", destPath, 1)
delCmd := exec.Command("bash", "-c", cmdStr)
if _, err := delCmd.Output(); err != nil {
fmt.Println(err)
return false
}
return true
}
// ComputeFileSizeByShell : 通过调用shell来计算文件大小
// @return (string, error): (文件hash, 错误信息)
func ComputeFileSizeByShell(destPath string) (int, error) {
cmdStr := strings.Replace(FileSizeCMD, "$1", destPath, 1)
fSizeCmd := exec.Command("bash", "-c", cmdStr)
if fSizeStr, err := fSizeCmd.Output(); err != nil {
fmt.Println(err)
return -1, err
} else {
reg := regexp.MustCompile("\\s+")
fSize, err := strconv.Atoi(reg.ReplaceAllString(string(fSizeStr), ""))
if err != nil {
fmt.Println(err)
return -1, err
}
return fSize, nil
}
}
// ComputeSha1ByShell : 通过调用shell来计算文件sha1
// @return (string, error): (文件hash, 错误信息)
func ComputeSha1ByShell(destPath string) (string, error) {
cmdStr := strings.Replace(FileSha1CMD, "$1", destPath, 1)
hashCmd := exec.Command("bash", "-c", cmdStr)
if filehash, err := hashCmd.Output(); err != nil {
fmt.Println(err)
return "", err
} else {
reg := regexp.MustCompile("\\s+")
return reg.ReplaceAllString(string(filehash), ""), nil
}
}
// MergeChuncksByShell : 通过调用shell来合并文件分块,分块文件名须有序 (如分块名分别为: 1, 2, 3, ...)
// @return bool: 合并成功将返回true, 否则返回false
func MergeChuncksByShell(chunkDir string, destPath string, fileSha1 string) bool {
// 合并分块
cmdStr := strings.Replace(MergeFileCMD, "$1", chunkDir, 1)
cmdStr = strings.Replace(cmdStr, "$2", destPath, 1)
mergeCmd := exec.Command("bash", "-c", cmdStr)
if _, err := mergeCmd.Output(); err != nil {
fmt.Println(err)
return false
}
// 计算合并后的文件hash
if filehash, err := ComputeSha1ByShell(destPath); err != nil {
fmt.Println(err)
return false
} else if string(filehash) != fileSha1 { // 判断文件hash是否符合给定值
fmt.Println(filehash + " " + fileSha1)
return false
} else {
fmt.Println("check sha1: " + destPath + " " + filehash + " " + fileSha1)
}
return true
}
2024年07月20日
1.gzip:gzip压缩工具
gzip命令的功能说明:
gzip 命令用于压缩文件。gzip 是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出 .gz 的扩展名。
gzip命令的语法格式:
2024年07月20日
ls -t | head -1的直觉答案是错误的,因为解析ls的输出是不安全的;相反,你应该创建一个循环并比较时间戳:
然后你将在$newest中得到最新的文件(按修改时间排序)。要获取最旧的文件,只需将-nt更改为-ot(请参阅help test了解操作符列表),当然还要更改变量的名称以避免混淆。
2024年07月20日
无论是有意还是无意,shell脚本中创建或删除了很多文件。由于使用了大量的文件,处理文件变得非常重要。即使一个简单的回显语句重定向输出到一个文件中,也必须首先打开该文件,将数据写入该文件,然后关闭该文件。让我们来看一个例子:
2024年07月20日
cd -- "$srcdir" &&
find . -type d -print | cpio -dumpv -- "$dstdir"
2024年07月20日
根据您可用的非标准工具的不同,有许多不同的方法可以实现这一目标。即使只使用标准的 POSIX 工具,您仍然可以执行大多数简单的情况。我们先展示可移植工具的示例。
您可以使用循环和一些参数扩展来执行大多数非递归的批量重命名,示例如下: