我在一台服务器上有几个编号为 1-10 的文件夹。每个文件夹都有多个文件。我需要找到具有模式名称的最新文件,例如:
- 文件 1:NA_UW_CLUSTER_RESULTS_210916.zip
- 文件 2:UW_CLUSTER_RESULTS_210916.zip
我需要选择“文件 2”并将其复制到另一台具有多个编号为 1-10 的相应文件夹的服务器。
因此,我需要将UW_CLUSTER_RESULTS_210916.zip
具有匹配模式的最新文件 ( ) 从“A”服务器中的“文件夹 1”复制到“B”服务器中的“文件夹 1”。
答案1
也许这对于您的用例来说已经足够了:
ls -1 -td /dir1/prefix1* /dir2/prefix2* | head -n 1
或者更稳健:
find /dir1 /dir2 -type f \( -path "*dir1/prefix1*" -o -path "*dir2/prefix2*" \) -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "
答案2
和zsh
:
set -o extendedglob
for folder ('folder '<->(n/))
scp $folder/*CLUSTER_RESULTS_[0-9](#c6).zip(om[1]) B:$folder/
它使用了一些 zsh 高级 glob 运算符:
<->
,这是<5-20>
匹配数字的运算符,但这里没有限制,因此可以匹配任何十进制整数[0-9]
:在 zsh 中仅匹配 0123456789 个字符(而不是其他 shell 通常匹配的数百个字符)。(#c6)
:类似于扩展正则表达式{6}
:匹配前面的 6 个内容,因此这里是数字(需要extendedglob
)。(om[1])
: 这部分是全局限定符。om
按修改时间o
排序m
(最新的优先),[1]
选择第一个。文件夹 glob 还使用 glob 限定符,n
以数字方式对 glob 结果进行排序(因此folder 10
在 后处理folder 9
,而不是在folder 1
和之间folder 2
)。/
限制为目录类型的文件。