3 个版本
0.1.6 | 2024年4月6日 |
---|---|
0.1.5 | 2024年3月27日 |
#79 in 文本处理
每月下载量 368
540KB
1.5K SLoC
FileOrganiser:信息文件管理工具
FileOrganiser (fileorg) 是一个命令行工具,可以快速列出、移动或删除大量嵌套文件夹中的文件,这些文件按年龄、文件扩展名、文件名模式和/或大小范围筛选。
它并不旨在取代常见的实用工具,如 ls、(dir) 和 find 与 mv 和 rm (移动 或 删除)结合,但它提供了更透明的概览和更流畅的工作流程,用于管理大量文件。
此包仍在开发中,我欢迎对它在不同文件系统上的性能反馈。该实用程序使用跨平台的 WalkDir 包,应适用于 Linux、Mac 和 Windows 的最新版本。
我主要在 Linux 服务器上使用开发版本来重新组织上传的媒体文件。虽然它一次只能在一个文件系统中工作,但它与挂载的块存储卷或使用与主机操作系统不同文件系统的 S3 对象存储桶没有任何问题。
主要用例
- 按大小、年龄和扩展名总结文件目录内容(-g 标志)
- 按年龄、大小、扩展名(s)和/或文件名模式筛选文件列表
- 将筛选文件移动到另一个目录
- 删除筛选文件(在没有 -f 标志的情况下提示)
已知问题
- 读取深度嵌套且文件数量众多的目录可能很慢。因此,默认最大深度设置为 5。如果您只想找出总磁盘使用量,请使用
du -ch --max-depth 1
。 - 如果目标路径以包含通配符的文件名结束,命令行解释器将内部将其扩展为匹配所有文件名的数组。对于 100 个或更多匹配的文件名,这并不高效。相反,在筛选数千个文件时,请使用
-e jpeg,jpg
扩展名或-p file_name_pattern
选项来按名称或扩展名筛选。 - 当前实现需要在应用后过滤程序(如模式匹配)之前扫描所有目录和文件。如果您只需查找文件,则标准find . -name '[pattern]'命令要快得多。
以下命令将为您提供目标目录及其子目录中所有jpeg、gif和png文件的概览,最大深度为3,最小文件大小为5M,最小年龄为30天。
以下示例假设系统范围内别名fileorg
fileorg-e jpg,jpeg,gif,png--size 5M--max-depth3 --before30
-l标志会显示包含其年龄、日期、类型和相对路径的单独文件条目。
fileorg-e jpg,jpeg,gif,png--size 5M--max-depth3 --before30 -l
如果您希望将这些文件移动到目标目录,同时保留原始的嵌套文件结构,请添加--move标志。
fileorg-e jpg,jpeg,gif,png--size 5M--max-depth3 --before30 -l--move /extended-drive/media
如果您希望删除这些文件,请添加--delete
或-u
标志(-d
表示最大深度)
fileorg-e jpg,jpeg,gif,png--size 5M--max-depth3 --before30 -l--delete
参数
- --before, -b只选择在指定天数之前修改的文件,
--before 30
超过30天。对于其他时间段,您可以使用后缀s
(秒)、m
(分钟)、h
(小时)、w
(周)或y
(年),例如5m
5分钟。您可以通过-a (--after)或简单地使用短横线来指定范围,例如-b 7-14
表示7到14天旧,而-b 30m-12h
表示30分钟到12小时旧。 - --after, -a只选择在指定天数之前修改的文件,
--after 30
新于30天。这可以与-b (--before)结合使用以指定年龄范围。 - --size, -s文件大小范围,以k(KB)、m(MB)或g(GB)为单位后缀。例如,1-2M = 1MB到2MB。单个大小默认为最小。要仅设置最大值,请使用逗号(,5MB)或使用0-5M范围。
- --ext, -e扩展名,省略以允许所有扩展名
- --not-ext, -n要排除的扩展名,例如,移动或删除所有不包含这些扩展名的文件
- --exclude-dirs, -q要排除的目录。这些相对于目标目录。如果以系统的目录分隔符(Linux和Mac上的
/
和Windows上的\
)开头,它将排除从父目录开始的所有子目录,否则它将排除任何嵌套级别的所有子目录。您可以使用逗号分隔的列表排除多个子目录路径,例如,/node_modules,/dist
将排除这些子目录中嵌套的所有文件。 - --list, -l标志以显示详细文件信息,而不仅仅是概览
- --groups, -g标志在主概览之前显示按扩展名组统计的信息
- --max-depth, -d要扫描的子目录最大深度。默认为5,以限制深度嵌套目录的解析开销。最大值为255。
- --pattern, -p文件名的匹配模式。添加
-x
标志以在引号中使用完整的正则表达式。 - --omit-pattern, -o排除与该模式匹配的文件名。这可以与
--pattern, -p
或--ext, -e
结合使用以进行更高级的模式匹配。 - --starts-with从文件名开始匹配模式
- --ends-with 从文件名末尾匹配模式,带或不带扩展名
- --regex-mode, -x 标志将上述模式解释为完整的正则表达式,例如,
a*
表示前面的字符可以有任意多个,否则 * 是任意字符的通配符,在完整正则表达式模式下是.*
。对于简单的模式匹配,.
被字面解释,而在完整正则表达式模式下它表示任意字符,并且必须转义才能匹配点。 - --copy, -c 复制到指定的新的目标目录。优先于
--move, -m
; - --move, -m 移动到指定的新的目标目录
- --delete, -u 删除符合上述标准的文件
- --force, -f 跳过批量删除的提示(对于cron作业很有用)
- --hidden, -y 匹配隐藏文件和目录,例如,
.git
作为文件夹或.gitignore
作为文件
安装
- 首先确保您已安装适用于您的操作系统的 Rust Cargo 编译器
- 检出仓库并切换到其目录
- 运行
cargo build --release
- 可执行文件将在
target/release/file-organiser
- 为文件组织器添加别名,例如 fileorg,或将符号链接添加到已存在于系统导出路径的目录中。
屏幕截图
使用 -g 选项显示按扩展名统计的基本列表:
仅显示 2 年前的 png 文件(-b before, -e extension):
显示 2 年前且大于 50MB 的 png 文件的完整列表(-b before, -e extension, -s size, -l full listing):
开发笔记
版本 0.1.6 修复了一个报告错误,对于 5 分钟内新文件,1m 25s 被错误地报告为 2m 45s,这是由于 f64 到 u64 转换中的舍入异常。我为 days_to_day_hours_min_secs()
函数添加了一个测试。
这是一个 alpha 版本。如果有人发现这很有用,我可能会为主要的操作系统打包它并使所有文本输出可本地化。
依赖关系
~6–15MB
~184K SLoC