Bash Automator-在筛选列表中查找并移动最近的文件

Bash Automator-在筛选列表中查找并移动最近的文件,bash,automator,Bash,Automator,我正试着用自动机来 获取文件夹中超过30天的文件的筛选列表确定 如果存在最新的子文件夹,请将其移动到现有子文件夹中 把其他的都扔掉。 第1步很简单,但我还没有找到一种方法来执行第2步-选择并移动最新的过滤集 结果是:如果工作流每月计划一次,则子文件夹每月将包含一个文件,父文件夹将仅包含31天以下的文件 有办法吗 更新 我尝试将shell脚本添加到automator工作流中 fn=$(ls -t | head -n1) mv -f -- "$fn" ./<subdirectory>/

我正试着用自动机来

获取文件夹中超过30天的文件的筛选列表确定 如果存在最新的子文件夹,请将其移动到现有子文件夹中 把其他的都扔掉。 第1步很简单,但我还没有找到一种方法来执行第2步-选择并移动最新的过滤集

结果是:如果工作流每月计划一次,则子文件夹每月将包含一个文件,父文件夹将仅包含31天以下的文件

有办法吗

更新 我尝试将shell脚本添加到automator工作流中

fn=$(ls -t | head -n1)
mv -f -- "$fn" ./<subdirectory>/
但是我在第二行的路径上遇到了问题

ls-t | head-n1不错,但要小心;如果subdir是最近修改的,它将占用第一个插槽,这不仅会导致尝试将该dir移动到自身中,这可能是第二行中的路径问题,而且可能会删除其余文件,包括要保留的文件。有很多方法可以过滤掉任何目录;从我的头顶上你可以看到ls-tp | grep-v'/$| head-n1。请注意,将文件添加到目录会影响posix上的目录mtime上次修改时间

删除所有文件很容易,一旦移出要保留的文件,只需rm*。请注意,只要不放-r,这就不会删除目录,我认为这是您想要的,因为您似乎正在将要保留的文件移动到它所在的子目录中

您可能还需要添加一些错误捕获,因此如果某个步骤失败,请不要删除您不希望删除的文件。我不使用automator,但只要您使用真正的bash(包括其他调度器,如cron),只要您首先进入正确的工作目录,它就应该可以工作

mv-$ls-tp | grep-v'/$'| head-n1子目录/&rm* &&意思是只有在前面的事情成功的情况下才去做后面的事情。在目标文件的开头添加./s没有任何作用,但如果子目录不存在,则将/保留在末尾会阻止创建名为subdirectory的新文件。另外,我很确定您发送的代码片段中的内容是将其标记为与实际代码不同,但以防万一:请注意,如果子目录确实包含这些字符,则无论其名称如何,可能需要进行特殊处理

编辑:

我刚刚注意到,在这个问题中,约束得到了一个文件夹中超过30天的文件过滤列表。因此,有一个小小的变化:使用find来比较时间

mv-$find-maxdepth 1-type f-mtime+30-printf'%T@%f\n'| sort-rn | head-n1 | cut-d \-f2-子目录/&&find-maxdepth 1-type f-mtime+30-delete 说明:在当前目录中查找非子目录,因此maxdepth 1文件不是目录,请键入f,其中mtime在过去至少为30天-mtime+30,并打印修改时间和名称%T@%f;将其排序为一个数字-n,顺序与-r相反;只取第一个头-n1;提取文件名第二个+空格分隔的字段并将其移动到子目录。如果成功,请删除符合与以前相同的查找条件的任何内容

除非磁盘速度/非常/慢且未缓存,否则我不会将文件放入环境变量中。过滤掉您移动的文件名所花的时间可能比重新查询磁盘要花更多的精力,除非您的文件数量太多,在这种情况下,它们可能不适合环境部分

编辑2:卡米尔库克是对的。使用以null结尾的字符,因为null是文件名中唯一不允许的字符:

find-maxdepth 1-type f-mtime+30-printf'%T%f\0'| sort-z-T'-r-n-s-k1 | head-z-n1 | cut-z-d'-f2-| xargs-0-I{}mv}子目录/&find-maxdepth 1-type f-mtime+30-delete
@KamilCuk是的,显然有一些奇怪的潜在文件名可能会导致问题。实际上,用-print而不是-delete来测试这一点,我看到find用一个?除非输出到一个非tty,所以是的,否则在这种情况下,移动可能会以失败状态中断,因此不会发生删除。如果要支持包含换行符的文件名,则需要一个更健壮的过滤程序,在这种情况下,应该使用能够更好地处理原始字符代码的语言来创建某些内容。只需使用零分隔流即可。像find-maxdepth 1-type f-mtime+30-printf'%T%f\0'| sort-z-T'-r-n-s-k1 | head-z-n1 | cut-z-d'-f2-| xargs-0-I{}mv}子目录/I不知道sort有这个选项,但是的,这很好。总有一天我会用的。太棒了,谢谢你。我一直在努力完成它,并有点让它工作,但这是更好的。非常感谢。