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

标签 linux bash shell unix

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

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 部分。我不能对字段使用剪切,因为文件名可能类似于 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

任何人都可以帮助我做到这一点。我尝试了查找和剪切,但没有得到所需的结果。

非常感谢

最佳答案

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

关于linux - 根据 bash 中文件名的子字符串复制最新更新的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51713636/

相关文章:

android - 如何使内联函数在可执行文件中只占用一份内存空间

c++ - 在 debian linux 中使用 c 复制文件

bash - OS X GNU- screen 破坏着色

bash - 如何在 bash shell 中执行由 for 循环生成的 curl 命令?

shell - 如何判断终端是否是windows终端

linux - Ubuntu 命令 UNIX - 查找不能用作登录 ID 的用户 ID 并打印最大的文件

linux - 如何使用shell脚本读取数组中的文件内容?

python - 如何编写将文本输入程序的 bash 脚本

python - Airflow 中的动态任务定义

bash - git auto-complete 不提示分支名称