golang批量删除fastdfs文件

1、根据文件完整链接批量删除fastdfs文件,golang内容如下:

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"os/exec"
	"strings"
)
//删除文件
func del(fileid string) {
	cmd := exec.Command("fdfs_delete_file", "/etc/fdfs/client.conf", strings.TrimSpace(fileid))
	out, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Println("fileid:", fileid)
		fmt.Println("output:", string(out))
		log.Fatal("删除文件报错:", err)
	}
	fmt.Println("已删除文件:", fileid)
}

// 检查文件是否存在
func check_file(filename string) {
	cmd := exec.Command("ls", filename)
	out, _ := cmd.CombinedOutput()
	if strings.TrimSpace(string(out)) == filename {
		file_id := strings.Replace(string(out), "/data/fastdfs/storage/data", "group1/M00", -1)
		del(file_id)
	}
}
func main() {
	f, err := os.Open("fdfs.txt")
	if err != nil {
		log.Fatal("打开文件报错:", err)
	}
	defer f.Close()
	scan := bufio.NewScanner(f)
	for scan.Scan() {
		line := scan.Text()
		filename := strings.Replace(line, "http://test.com/group1/M00", "/data/fastdfs/storage/data", -1)
		check_file(filename)
	}
}

fdfs.txt文件是要提前准备好的,里面都是完整的文件链接,如下:

http://test.com/group1/M00/00/00/wKgx4GhrKIGALIv1AAXuTr3P82s869.pdf
http://test.com/group1/M00/00/00/wKgx4GhrKIGALIv1AAXuTr3P82s865.pdf
http://test.com/group1/M00/00/00/wKgxumhrL26AEhK8AAXuTr3P82s774.pdf

2、去fastdfs里寻找指定日期之前的文件并删除,比如要删除100天之前的pdf文件,如下:

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"os/exec"
	"strings"
)

/*
@date: 20250918
@author: gongguan
@function: 删除fastdfs中文件
*/
func findFdfs(filepath, filetype, filetime string) {
	cmd := exec.Command("find", fmt.Sprintf("%s", filepath), "-type", "f", "-name", fmt.Sprintf("*%s", filetype), "-mtime", fmt.Sprintf("+%s", filetime))
	out, err := cmd.CombinedOutput()
	if err != nil {
		log.Fatal("查找文件错误:", err)
	}
	f, err := os.OpenFile("linshi.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0655)
	if err != nil {
		log.Fatal("打开linshi.txt文件错误:", err)
	}
	defer f.Close()
	_, err = f.Write(out)
	if err != nil {
		log.Fatal(err)
	}
}
func del(id string) {
	cmd := exec.Command("fdfs_delete_file", "/etc/fdfs/client.conf", id)
	_, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Println("文件名称:", id)
		log.Fatal("删除文件报错:", err)
	}
}
func main() {
    //这里接收三个参数
    //1、要删除的文件所在目录
    //2、要删除的文件后缀名
     //3、要删除的文件日期,如果写10那就是10天前
	fileparam := os.Args[1:]
	//首先从存处理拿到指定的后缀名的文件,多少天之前的文件,并保存到linshi.txt中
	findFdfs(fileparam[0], fileparam[1], fileparam[2])
	//打开这个临时的linshi.txt文件(目的是要处理其中重复的文件记录)
	tempFile, err := os.Open("./linshi.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer tempFile.Close()
	m := make(map[string]int)
	scan := bufio.NewScanner(tempFile)
	for scan.Scan() {
		line := scan.Text()
		m[line] = 1 //将文件内容循环写入到map中(map会过滤重复内容)
	}
        //创建一个新文件fdfs.txt
	newFile, err := os.Create("fdfs.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer newFile.Close()
        //循环遍历map,将键写入到文件中,键就是文件内容,此时已经去重
	for k, _ := range m {
		_, err := newFile.WriteString(fmt.Sprintf("%s\n", k))
		if err != nil {
			log.Fatal(err)
		}
	}
	//打开fdfs.txt文件
	file, err := os.Open("fdfs.txt")
	if err != nil {
		log.Fatal("打开文件报错:", err)
	}
	defer file.Close()
	scan1 := bufio.NewScanner(file)
	res := ""
	for scan1.Scan() {
		line := scan1.Text()
		if strings.HasSuffix(fileparam[0], "/") {
			res = strings.Replace(line, fmt.Sprintf("%s", fileparam[0]), "group1/M00/", 1)
		} else {
			res = strings.Replace(line, fmt.Sprintf("%s", fileparam[0]), "group1/M00", 1)
		}
		del(res)
	}
}

最后面的if 流程控制的意思就是判断你在输入的文件路径参数的时候后面有没有加”/”,如果加了,那么在替换的时候就要写为group1/M00/,否则就会变成group1/M0000/06/….这种,如果没加,就替换为group1/M00,脚本的执行方式可以参考如下:

#比如已经将delfdfs.go编译为二进制文件delfdfs
./delfdfs /data/fdfs/storage0/data pdf 10 #这里的意思就是说删除/data/fdfs/storage0/data这个路径下10天以前的pdf文件 

直接将上述编译后的二进制文件放到fastdfs环境中执行即可,如果是通过docker运行的fastdfs,那么就需要copy到容器中,然后运行

标签