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 回复
请注意,这样做会删除所有以“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等文件。

