根据bash中文件名中的子字符串复制最新的更新文件

时间:2018-08-06 18:28:41

标签: linux bash shell unix

我必须从一个文件夹中存档一些文件(基于文件中的日期),但是可以有多个具有相同名称(子字符串)的文件。我只需将最新的文件复制到一个saperate文件夹中。

for eg.
20180730.abc.xyz2.jkl.20180729.164918.csv.gz

在此-> 20180730和20180729代表我必须在(第一日期)20180730之前进行搜索的日期。

我写的搜索部分是:

for FILE in $SOURCE_DIR/$BUSINESS_DT*
{
do
 # Here I have to search if this FILENAME exists and if yes, then copy that  latest file
 cp "${FILE}" $TARGET_DIR/
done

现在,我必须搜索相同的SOURCE_DIR是否包含名称类似于20180730.abc.xyz2.jkl的文件。如果存在,那么我必须复制它。 所以基本上,我必须提取abc.xyz2.jkl部分。我不能对字段使用cut,因为文件名可能像abc.xyz2.jkl或abc.xyz。该部分是可变的,也可以有数字,最后两个数字也是可变的,可以更改。 例如:

20180730.abc.xyz2.jkl.20170729.890789.csv.gz
 20180730.abc.xyz2.20180729.121212.csv.gz
 20180730.ab.xy.20180729.11111.csv.gz

有人可以帮我吗?我尝试查找并剪切,但没有得到所需的结果。

非常感谢

1 个答案:

答案 0 :(得分:0)

Python可能是实现此类目标的更好选择,但这是一个bash示例。您可以使用sed位置参数提取所需的文件名部分。然后,使用关联数组存储包含找到的子字符串的最新文件的文件名。  完成后,您可以返回并执行复制操作。这是一个提取两个8位数字和句点之间的字符串的示例。这个sed表达式可能不适用于您的完整数据集,但适用于您提供的3个示例。同样,这将无法处理一个唯一标识符是另一个唯一标识符的子集的情况。

declare -A LATEST
for FILE in $SOURCE_DIR/$BUSINESS_DT*
do
     # Extract the substring unique identifier
    HASH=$(echo "${FILE}" |  sed "s/[0-9]\{8\}\.\(.*\)\.[0-9]\{8\}.*$/\\1/g")

    # If this is the first time on this unique identifier,
    # then get the latest matching file
    if [ ${LATEST[${HASH}]}abc == abc ]
    then
        LATEST[${HASH}]=$(find . -type f -name '*${HASH}*' -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" ")
    fi
done

for FILE in "${!LATEST[@]}"
do
    cp "${FILE}" $TARGET_DIR/
done