读取目录下的文件并按时间进行排序

按时间排序与删除文件:Go 语言实现
该博客介绍了一个用 Go 语言编写的程序,它能按修改时间从旧到新对指定目录下的文件进行排序。当文件数量超过5个时,程序会从最旧的文件开始删除,以保持目录内不超过5个文件。同时,程序还会创建一个新的文件,其名称包含当前时间戳。这是一个文件管理的实用示例。

根目录不包含子目录,使用[]os.FileInfo 切片定义文件按时间排序。按时间从远到近排序,文件总数如果大于 5 个,就从远的开始删除。

package main

import (
	"fmt"
	"log"
	"os"
	"sort"
	"strings"
	"time"
)

type ByModTime []os.FileInfo

func (fis ByModTime) Len() int {
	return len(fis)
}

func (fis ByModTime) Swap(i, j int) {
	fis[i], fis[j] = fis[j], fis[i]
}

func (fis ByModTime) Less(i, j int) bool {
	return fis[i].ModTime().Before(fis[j].ModTime())
}
// 根目录下的文件按时间大小排序,从远到近
func SortFile(path, name string) (files ByModTime) {
	f, err := os.Open(path)
	if err != nil {
		fmt.Println(err)
	}
	fis, err := f.Readdir(-1)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	files = make(ByModTime, len(fis)+10)
	j := 0
	for i, v := range fis {
		if strings.Contains(fis[i].Name(), name) {
			files[j] = v
			j++
		}
	}
	files = files[:j]

	sort.Sort(ByModTime(files))
	// for _, fi := range files {
	// 	fmt.Println(fi.Name())
	// }
	return
}

// 返回当下时间的文件,并删除大于 5 个的文件,删除最早的,如果目录下没有文件,就自动创建
func DealWithFiles(path, name string) (filename string) {
	timestamp := time.Now().Format("20060102.150405")
	filename = path + name + "." + timestamp
	files := SortFile(path, name)
	// fmt.Println(path + files[len(files)-1].Name())
	if len(files) > 5 {
		for k, _ := range files[5:] {
			err := os.Remove(path + files[k].Name())
			if err != nil {
				log.Fatal(err)
			}
		}
	} else if len(files) == 0 {
		f, err := os.Create(filename)
		defer f.Close()
		if err != nil {
			log.Fatal(err)
		}
	}
	// fmt.Println(filename)
	return filename
}

func main() {
	path := "/res/csv/"
	name := "user.csv"

	files := DealWithFiles(path, name)
	fmt.Println(files)
}

文件格式为:

# tree /res/csv
/res/csv
├── user.csv.20201206.153543
├── user.csv.20201206.153655
├── user.csv.20201206.153715
├── user.csv.20201206.153749
└── user.csv.20201206.154620

执行结果:

#go run /go/eg/1.go
/res/csv/user.csv.20201207.090806

 

本文转载自:https://www.icode9.com/content-4-777325.html

<think>我们想要读取Ubuntu系统中home目录下各文件的大小排序。根据用户需求,我们将使用命令行工具来实现。 步骤: 1. 使用`du`命令来获取文件目录的大小。根据引用[3]可知,`du`命令可以显示目录文件的磁盘使用情况。 2. 我们需要进入home目录(`/home`)或者直接指定路径,然后递归地获取每个子目录文件的大小。 3. 为了便于阅读,我们使用`-h`选项以人类可读的格式(如K、M、G)显示大小。 4. 按照文件大小进行排序,我们可以使用`sort`命令。 但是注意:`du`命令默认会递归地列出所有子目录的大小,如果我们想要每个文件目录的单独大小(非累计),可以使用`-a`选项(来自引用[3]:-a递归显示指定目录中各文件和子目录文件占用的数据块)。 因此,命令可以是: ```bash du -ah /home | sort -rh ``` 解释: - `du -ah /home`:递归显示`/home`下每个文件目录的大小(以人类可读格式)。 - `sort -rh`:`-r`表示逆序(从大到小),`-h`表示按人类可读的数值排序(这样1K会小于2M,依此类推)。 注意:这个命令可能会列出非常多的文件,如果只需要查看最大的几个,可以使用`head`命令,例如: ```bash du -ah /home | sort -rh | head -n 20 ``` 另外,如果只想查看目录(不包括文件),则去掉`-a`选项,但这样会显示每个目录的累计大小: ```bash du -h /home | sort -rh ``` 但是用户要求的是“各文件”,所以应该包括文件。因此使用`-a`。 重要提示:执行这些命令可能需要一些时间,因为`/home`目录可能很大。 另外,如果用户只想查看当前用户的主目录(而不是整个`/home`),可以将路径改为`~`,例如: ```bash du -ah ~ | sort -rh | head -n 20 ``` 根据引用[1]中的描述,`/home`是存放普通用户目录的地方,所以如果用户有多个用户账户,使用`/home`会列出所有用户的主目录。如果用户只想查看自己的主目录,使用`~`(代表当前用户的主目录)更合适。 因此,我们提供两种方式: 1. 查看整个`/home`目录(需要root权限才能访问其他用户的目录,普通用户只能访问自己有权限的目录): ```bash sudo du -ah /home | sort -rh | head -n 20 ``` 注意:使用sudo可能会要求输入密码,且可以访问所有用户的主目录。 2. 查看当前用户的主目录(无需root权限): ```bash du -ah ~ | sort -rh | head -n 20 ``` 由于用户的问题描述是“读取home目录”,可能指的是整个`/home`,也可能是当前用户的主目录。为了明确,我们提供两种选择。 但根据常规需求,用户通常关注的是自己主目录下的大文件,因此我们重点推荐第二种。 另外,如果用户希望避免显示某些目录(比如隐藏目录),可以使用`--exclude`选项,例如: ```bash du -ah --exclude=".*" ~ | sort -rh | head -n 20 ``` 这样可以排除隐藏文件(以.开头的文件)。 但是注意:隐藏文件中也可能有大文件(如.config、.cache等),所以排除隐藏文件可能会漏掉一些大文件。 所以,我们通常不推荐排除隐藏文件,除非用户明确要求。 总结命令: **查看当前用户主目录下所有文件目录的大小(包括隐藏文件),按从大到小排序,显示前20个:** ```bash du -ah ~ | sort -rh | head -n 20 ``` **查看整个/home目录(需要root权限):** ```bash sudo du -ah /home | sort -rh | head -n 20 ``` 注意:如果文件系统中有很多小文件,这个命令可能会运行一段时间。 此外,如果用户希望只显示文件而不显示目录,可以使用`find`命令配合`du`。例如: ```bash find ~ -type f -exec du -h {} + | sort -rh | head -n 20 ``` 解释: - `find ~ -type f`:在当前用户主目录下查找所有普通文件。 - `-exec du -h {} +`:对每个找到的文件执行`du -h`(显示文件大小)。 - 然后排序取前20。 这个命令只统计文件,忽略目录。 用户可以根据需求选择。 因此,我们给出两种方式(显示文件目录,或只显示文件)的命令。 最终回答: 要查看Ubuntu系统home目录下各文件大小排序,请按照以下步骤操作: 1. 打开终端(Ctrl+Alt+T)。 2. 根据您的需求选择以下命令之一: **方式一:查看当前用户主目录下的文件目录(包括隐藏项)大小排序(显示前20个)** ```bash du -ah ~ | sort -rh | head -n 20 ``` **方式二:查看整个/home目录(需要root权限)** ```bash sudo du -ah /home | sort -rh | head -n 20 ``` **方式三:只查看当前用户主目录下的文件(不包括目录)大小排序(显示前20个)** ```bash find ~ -type f -exec du -h {} + | sort -rh | head -n 20 ``` 3. 等待命令执行完成(时间取决于文件数量和大小)。 说明: - 使用`du -ah`会递归列出所有文件目录的大小,其中`-a`表示显示所有文件(包括普通文件目录),`-h`表示以易读格式(KB、MB、GB)。 - `sort -rh`中的`-r`表示逆序(从大到小),`-h`表示按人类可读的数值排序。 - `head -n 20`表示只显示前20行结果。 注意事项: - 如果遇到权限问题,请尝试使用`sudo`(在方式一中通常不需要,因为您的主目录您有权限;方式二需要sudo)。 - 方式三(使用`find`)可能会因为文件数量过多而导致参数列表过长,此时可以改用`find ~ -type f -print0 | xargs -0 du -h | sort -rh | head -n 20`,但这样会失去易读格式的排序(因为`xargs`后面的`du -h`输出是每个文件一行,但`sort -h`仍然可以排序)。不过,在大多数现代系统上,`find ... -exec ... +`已经能够处理大量文件。 示例输出(片段): ``` 4.0G /home/user/Videos/movie.mp4 3.5G /home/user/Downloads/large_file.zip 2.1G /home/user/.cache/some_cache ... ``` 这样,您就可以快速定位home目录中的大文件,从而进行清理。 如果您需要更详细的解释或遇到问题,请参考相关引用内容或进一步提问。 §§相关问题§§ 1. 如何在Ubuntu中只查找排序指定类型的文件(例如.log文件)? 2. 如何定时自动清理Ubuntu系统中的大文件或旧文件? 3. 为什么使用`du`和`df`查看磁盘空间时结果不一致? </think> ### Ubuntu系统读取home目录下各文件大小排序的方法 在Ubuntu中查看`/home`目录文件大小排序,可通过终端命令实现。以下是详细步骤: #### 1. **查看当前用户home目录大小排序** ```bash # 递归显示所有文件/目录大小(含隐藏文件),按从大到小排序,显示前20项 du -ah ~ | sort -rh | head -n 20 ``` - **命令解析**: - `du -ah ~`: `-a`显示所有文件/目录(包括隐藏文件)[^3],`-h`以人性化单位(KB/MB/GB)输出,`~`代表当前用户home目录(如`/home/username`)。 - `sort -rh`: `-r`倒序排列(从大到小),`-h`按人类可读的单位数值排序(如`2G > 100M`)。 - `head -n 20`:仅显示前20个最大项。 #### 2. **查看整个/home目录大小排序(需root权限)** ```bash # 查看所有用户的home目录,按大小排序 sudo du -ah /home | sort -rh | head -n 20 ``` - **适用场景**:管理员需检查所有用户存储情况时使用,需输入密码授权。 #### 3. **仅显示文件(排除目录)** ```bash # 只列出文件(不包含目录),按大小排序 find ~ -type f -exec du -h {} + | sort -rh | head -n 20 ``` - **关键参数**: `find ~ -type f` 筛选普通文件,`-exec du -h {} +` 对每个文件执行大小计算。 --- ### 输出示例 ```bash 12G /home/user/Videos/movie.mp4 4.2G /home/user/backup.tar.gz 1.8G /home/user/.cache/chromium ... ``` ### 注意事项 1. **权限问题**: - 普通用户只能查看自己有权限的目录(如自己的`~`)。 - 系统级目录(如其他用户的home)需`sudo`提权[^1]。 2. **排序准确性**: - 必须用`sort -h`而非`sort -n`,否则单位转换可能导致错误(如`1G`会被误判小于`500M`)。 3. **隐藏文件**: - 大文件常位于隐藏目录(如`~/.cache`或`~/.local`),`du -a`可包含这些文件[^1]。 --- ### 清理建议 定位大文件后,可手动清理: ```bash # 删除确认不需要的大文件 rm /path/to/large_file # 清空用户缓存(释放GB级空间) rm -rf ~/.cache/* ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值