我必须从一个文件夹中存档一些文件(基于文件中的日期),但是可以有多个具有相同名称(子字符串)的文件。我只需将最新的文件复制到一个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
有人可以帮我吗?我尝试查找并剪切,但没有得到所需的结果。
非常感谢
答案 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