我有一个文件夹,每天都会填充一系列文件,例如content1_20231110.csv
,,content2_20231110.csv
等等。由于我无法控制的原因,这个文件夹保存了一整年的记录,数千个文件。
我目前正在手动将每天的文件从该文件夹复制到另一个共享驱动器。这非常容易,因为文件资源管理器允许您按修改日期排序,将我想要的所有文件放在一起。这些文件是在一夜之间生成的,因此我仍然必须通过文件名中的日期来识别我想要的文件,而不必仅通过修改日期来识别。
我创建了一个 bash shell 脚本来自动执行此任务。核心方法是使用以下命令根据文件名称中的日期识别文件并复制它们:
cp $originalFolderMapping/*$targetDate* $destinationFolderMapping
如果我想要的文件被隔离在它们自己的文件夹中(我是为了测试而这样做的),那么此方法可以正常工作。但搜索未排序的原始文件夹需要花费相当长的时间。共享驱动器中的文件也可能会减慢速度。
在文件资源管理器中按修改日期排序可以快速轻松地进行排序,使我想要的所有文件彼此相邻并且方便手动复制。有没有办法在 shell 脚本中执行类似的操作来快速执行此任务?先感谢您。
答案1
提到文件资源管理器让我想知道您是否使用的是 Windows,也许 bash 是在 cygwin 中运行的。如果是这种情况,cygwin 中间层可能会使本来就相对较慢的 NTFS 文件系统显得慢很多。
正如 Chris Davies 所指出的,如果文件系统(也)位于网络共享上,这将使“cp”中的 glob(文件路径扩展)速度慢得多。
一种可以尝试的选择(可能行不通)是考虑请求完整的目录列表(例如ls -1 $dir >/tmp/file
),然后使用 awk、python 或 perl 等工具来过滤该列表并进行所需的更改。鉴于文件是在一夜之间创建的,列表文件应该只需要很少更新,因此可能值得跟踪它的最新程度以及当前操作是否需要更新。
我注意到您正在使用“cp”,因此随着时间的推移,问题变得越来越严重,因为没有文件被删除,但添加了新文件。虽然现代文件系统通常比旧文件系统要好得多,但使用非常大的目录总是会产生查找成本。 NTFS 和其他文件系统使用散列目录结构,这意味着特定文件名的查找比任何类型的搜索都要快得多。
因此,作为次要任务,处理此文件夹的组织者,使其能够以某种方式进行分割 - 例如按年份或周数,无论什么方式。你所拥有的东西是不可持续的,并且容易出现多种形式的错误。