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