#文件管理器 #文件名 #文件扩展名 #命令行 #文件系统 #文件工具 #目录

app file-organiser

命令行文件管理器,可按年龄、文件扩展名、文件名模式和/或大小范围筛选,列出、移动或删除大量嵌套文件夹中的文件

3 个版本

0.1.6 2024年4月6日
0.1.5 2024年3月27日

#79 in 文本处理

Download history 1/week @ 2024-05-16 2/week @ 2024-05-23

每月下载量 368

GPL-2.0-or-later WITH Bison-exception-2…

540KB
1.5K SLoC

mirror crates.io docs.rs

FileOrganiser:信息文件管理工具

FileOrganiser (fileorg) 是一个命令行工具,可以快速列出、移动或删除大量嵌套文件夹中的文件,这些文件按年龄、文件扩展名、文件名模式和/或大小范围筛选。

它并不旨在取代常见的实用工具,如 ls、(dir) 和 findmvrm移动删除)结合,但它提供了更透明的概览和更流畅的工作流程,用于管理大量文件。

此包仍在开发中,我欢迎对它在不同文件系统上的性能反馈。该实用程序使用跨平台的 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 选项显示按扩展名统计的基本列表:截图 1

仅显示 2 年前的 png 文件(-b before, -e extension):截图 2

显示 2 年前且大于 50MB 的 png 文件的完整列表(-b before, -e extension, -s size, -l full listing):截图 2

开发笔记

版本 0.1.6 修复了一个报告错误,对于 5 分钟内新文件,1m 25s 被错误地报告为 2m 45s,这是由于 f64 到 u64 转换中的舍入异常。我为 days_to_day_hours_min_secs() 函数添加了一个测试。

这是一个 alpha 版本。如果有人发现这很有用,我可能会为主要的操作系统打包它并使所有文本输出可本地化。

依赖关系

~6–15MB
~184K SLoC