我有目录结构adc/asd/abc.20150918_150635.gz
,adc/asd/abc.20150921_140748.gz
...(其中.gz
文件名包含其创建的时间戳)。这里还存在许多与 asd 类似的其他目录,例如。adc/gmf/abc.20150918_010738.gz
、adc/ret/abc.20150921_140748.gz
、 所有这些都包含带有时间戳的文件。
我想使用单个命令从所有目录(即从asd
、gmf
等ret
)复制最新修改的文件:)。
我尝试过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
.