Golang实现批量删除同名但不同扩展名的文件

Golang实现批量删除同名但不同扩展名的文件 你好。我需要帮助。需要编写一个程序,删除所有具有相同名称但不同扩展名的文件(例如,我们在终端中指定名称“1”,那么所有名为“1”的文件(1.txt、1.docx、1.xlsx 等)都将被删除)。

以下是我目前能做的:

package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	file, erPreformatted textr := os.Create("1.txt")
	if err != nil {
		log.Fatal(err)
	}
	file.Close()

	var name string
	fmt.Println("File name")
	fmt.Scanf("%s\n", &name)

	err = os.Remove(name)
	if err != nil {
		fmt.Println(err)
		return
	}
}

更多关于Golang实现批量删除同名但不同扩展名的文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

谢谢。这真的很有帮助。

更多关于Golang实现批量删除同名但不同扩展名的文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请注意,这样做会删除所有以“1”开头的文件,包括“1st draft.docx”等。我建议反过来处理,不是匹配前缀,而是尝试移除扩展名,然后匹配整个文件名的其余部分。

for _, file := range files {
    filename := file.Name()
    ext := filepath.Ext(filename)
    prefix := filename[:len(filename)-len(ext)]
    if prefix == name {
        // 删除它
    }

这段代码或许对你有帮助。

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strings"
)

func main() {
	file, err := os.Create("1.txt")
	if err != nil {
		log.Fatal(err)
	}
	file.Close()

	var name string
	fmt.Println("File name")
	fmt.Scanf("%s\n", &name)

	path := "./"
	files, err := ioutil.ReadDir(path)
	if err != nil {
		log.Fatal(err)
	}

	for _, file := range files {
		filename := file.Name()
		if !file.IsDir() && strings.HasPrefix(filename, name) {
			fmt.Println("Removing ", filename)
			if err := os.Remove(filename); err != nil {
				log.Fatal(err)
			}
		}
	}
}

以下是实现批量删除同名不同扩展名文件的完整解决方案:

package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	// 获取用户输入的文件名
	var baseName string
	fmt.Print("Enter base filename (without extension): ")
	fmt.Scanf("%s\n", &baseName)

	// 获取当前目录
	currentDir, err := os.Getwd()
	if err != nil {
		log.Fatal("Error getting current directory:", err)
	}

	// 查找并删除匹配的文件
	filesDeleted := 0
	err = filepath.Walk(currentDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return nil // 跳过无法访问的文件
		}

		// 只处理普通文件,跳过目录
		if info.IsDir() {
			return nil
		}

		// 获取文件名(不含路径)
		filename := info.Name()
		
		// 分离文件名和扩展名
		fileBase := strings.TrimSuffix(filename, filepath.Ext(filename))
		
		// 如果基础名称匹配,删除文件
		if fileBase == baseName {
			err := os.Remove(path)
			if err != nil {
				fmt.Printf("Error deleting %s: %v\n", filename, err)
			} else {
				fmt.Printf("Deleted: %s\n", filename)
				filesDeleted++
			}
		}
		
		return nil
	})

	if err != nil {
		log.Fatal("Error walking directory:", err)
	}

	fmt.Printf("\nTotal files deleted: %d\n", filesDeleted)
}

更高效的版本,只扫描当前目录(不递归子目录):

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	var baseName string
	fmt.Print("Enter base filename to delete: ")
	fmt.Scanf("%s\n", &baseName)

	// 获取当前目录文件列表
	files, err := ioutil.ReadDir(".")
	if err != nil {
		log.Fatal("Error reading directory:", err)
	}

	filesDeleted := 0
	for _, file := range files {
		if file.IsDir() {
			continue
		}

		filename := file.Name()
		fileBase := strings.TrimSuffix(filename, filepath.Ext(filename))
		
		if fileBase == baseName {
			err := os.Remove(filename)
			if err != nil {
				fmt.Printf("Error deleting %s: %v\n", filename, err)
			} else {
				fmt.Printf("Deleted: %s\n", filename)
				filesDeleted++
			}
		}
	}

	fmt.Printf("\nTotal files deleted: %d\n", filesDeleted)
}

支持命令行参数输入的版本:

package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	// 定义命令行参数
	baseName := flag.String("name", "", "Base filename to delete (without extension)")
	recursive := flag.Bool("r", false, "Recursive search in subdirectories")
	flag.Parse()

	if *baseName == "" {
		log.Fatal("Please specify filename using -name flag")
	}

	currentDir, err := os.Getwd()
	if err != nil {
		log.Fatal("Error getting current directory:", err)
	}

	filesDeleted := 0
	
	if *recursive {
		// 递归搜索
		err = filepath.Walk(currentDir, func(path string, info os.FileInfo, err error) error {
			if err != nil || info.IsDir() {
				return nil
			}
			
			filename := info.Name()
			fileBase := strings.TrimSuffix(filename, filepath.Ext(filename))
			
			if fileBase == *baseName {
				if err := os.Remove(path); err == nil {
					fmt.Printf("Deleted: %s\n", path)
					filesDeleted++
				}
			}
			return nil
		})
	} else {
		// 仅当前目录
		files, err := os.ReadDir(".")
		if err != nil {
			log.Fatal("Error reading directory:", err)
		}

		for _, file := range files {
			if file.IsDir() {
				continue
			}
			
			filename := file.Name()
			fileBase := strings.TrimSuffix(filename, filepath.Ext(filename))
			
			if fileBase == *baseName {
				if err := os.Remove(filename); err == nil {
					fmt.Printf("Deleted: %s\n", filename)
					filesDeleted++
				}
			}
		}
	}

	fmt.Printf("\nTotal files deleted: %d\n", filesDeleted)
}

使用方法:

# 交互式输入
go run main.go

# 命令行参数
go run main.go -name "1"
go run main.go -name "document" -r

这个程序会删除所有基础名称匹配的文件,无论扩展名是什么。例如输入"1"会删除1.txt、1.docx、1.xlsx等文件。

回到顶部