我有一堆具有如下模式的文件:
{UID}-YYMMDD-HHMMSSMM-NEW.xml
或者一个真实的例子:
56959-140918-12465122-NEW.XML
我想按照文件名中包含的日期和时间顺序将这些文件复制到另一个目录。我也只想将其应用于与上述模式匹配的文件名。
是否有任何工具可以做到这一点?如果没有,我想可以使用脚本之类的东西。
- 通过正则表达式匹配文件名
- 通过正则表达式匹配日期部分,然后按日期升序列出
- 对于每个日期,通过正则表达式匹配时间,然后按时间升序列出,将每个文件添加到全局列表中。
- 组织完文件列表后复制文件
答案1
如果所有匹配的文件都在当前目录中(并且不在任何子目录中或者子目录名称不包含-
),则可以使用步骤 1 到 3:
find -regex '.*/[0-9]+-[0-9]+-[0-9]+-NEW\.XML' | sort --field-separator=- --key=2 > filelist
对于步骤 4:
while IFS= read -r line; do
cp -v $line /PATH/TO/DESTFOLDER/
done < filelist
解释:正则表达式模式find
与具有所描述模式的所有文件相匹配。sort
分隔字段-
并首先根据第二个字段(日期)排序,然后根据后续字段(此处为第三个字段(时间))排序。描述了shell中处理行的方式这里。每行都存储在$line
变量中并复制到目标文件夹。选项-v
显示cp
当前复制的文件。
答案2
Zsh 有一个全局限定符更改 glob 的排序。告诉它按UID-
删除前缀的文件名排序。
cp <->-<->-<->-NEW.XML(oe\''REPLY=${REPLY#*-}'\') /somewhere/else/
(如果您想要精确的位数,请调整模式 -<->
匹配任何数字序列。)
请注意,文件复制的顺序可能是可观察的,也可能是不可观察的。大多数文件系统至少提供秒粒度的时间戳,但复制每个文件可能需要的时间要少得多。目录中的文件没有内在的顺序;要复制的第一个文件不一定是列出的第一个文件ls -f
(取决于文件系统,它可能经常发生或很少发生)。
答案3
我从您的案例中了解到,您需要根据文件名中的时间戳将具有此模式的文件复制到相应的文件夹。
为此,您可以迭代它们,并将每个文件移动到适当的目录:
for i in [[:digit:]]*-NEW.XML; do dirname="${i%6:6}"; mv $i $dirname; done;
ps 这里的循环将仅迭代与传递的文件匹配的文件正则表达式。