从多个目录复制最新修改的文​​件

从多个目录复制最新修改的文​​件

我有目录结构adc/asd/abc.20150918_150635.gzadc/asd/abc.20150921_140748.gz...(其中.gz文件名包含其创建的时间戳)。这里还存在许多与 asd 类似的其他目录,例如。adc/gmf/abc.20150918_010738.gzadc/ret/abc.20150921_140748.gz、 所有这些都包含带有时间戳的文件。

我想使用单个命令从所有目录(即从asdgmfret)复制最新修改的文​​件:)。

我尝试过cp "adc/*/abc.* .",但它会复制所有文件。我只想复制最新修改的文​​件(使用单个命令)。谁能帮我?

答案1

(.)要查找每个目录的最新纯文件(/),首先查找目录,然后查找每个目录中的最新文件(按 mtime 或 )的两遍方法(om[1])可能是最有意义的。对于 ZShell,这看起来像:

% typeset -a latest
% cd $TMPDIR
% mkdir latest
% cd latest/
% mkdir a b c 
% touch {a,b,c}/blah; sleep 3; touch {a,b,c}/a\ newer\ file
% for d in *(/N); do latest+=( $d/*(.om[1]) ); done
% [[ $#latest -eq 0 ]] && print uh oh
% print -l $latest
a/a newer file
b/a newer file
c/a newer file
% 

那么cp $latest destdir应该就足够了(假设找到了任何文件),除非由于某些无法解释的原因您SH_WORD_SPLIT在 ZSH 中启用了该选项,在这种情况下您需要像其他 shell 一样处理引用问题。

答案2

cp $(ls -1t */*/* | head -n 1) destdir

这是假设完整的文件列表适合可用的参数列表空间(否则您将收到“参数列表太长”错误)。

ls -1t将其参数按修改时间顺序排序(最新的在前,选项-t)并每行显示一个文件(-1选项)。head -n 1只占用第一行。

这将被替换到命令行中,以便您最终得到cp newestfile destdir.

相关内容