gpt4 book ai didi

bash - 需要使用 Shell 脚本从目录中选择最新文件

转载 作者:行者123 更新时间:2023-12-04 05:23:21 24 4
gpt4 key购买 nike

我是 Shell 脚本的新手,我需要使用 Shell 脚本从目录中选择最新的文件

目录名称:FTPDIR

此目录中的文件将属于

APC5502015VP072020121826.csv
APC5502015VP082020122314.csv
APC5502015VP092020121451.csv
CBC5502015VP092020122045.csv
CBC5502015VP102020122045.csv
S5502015VP072020121620.csv
S5502015VP072020122314.csv
S5502015VP092020122045.csv

注意:(需要从每个组中选择一个最新的)- 以下是我在执行 shell 脚本后需要得到的输出
APC5502015VP092020121451.csv
CBC5502015VP102020122045.csv
S5502015VP092020122045.csv

例如:在最新的文件 APC5502015VP092020121451.csv 中没有 092020121451 是格式中的日期部分: MMDDYYYYHHMM和字符串部分是 APC5502015VP(字符串部分的长度不固定)

我需要使用 shell 脚本从目录中选择这三个文件

你能帮我解决这个问题吗?

最佳答案

仅使用 bash 安全地执行此操作将非常有问题。正如乔纳森所提到的,像空格或换行符这样的“特殊”字符可能会阻塞你的脚本。

如果我们可以假设不会有任何这些,那么我们可以在 bash 中完成大部分工作,而无需涉及其他工具。

# Make an associative array to record types, in the second loop...
declare -A a

for file in *.csv; do
# First, we convert the filenames into something that can be sorted.
# The next three lines account for your "unknown length" in the first part
# of the filename. We assume the date+time is the 12 chars before ".csv".
new="$(rev <<<"$file")"
new="${new:4:12}"
new="$(rev <<<"$new")"
new="${new:4:4}${new:0:2}${new:2:2}${new:8:4}"
len=$(( ${#file} - 16 ))
echo "$new ${file:0:$len} $file"
done | sort | while read date type file; do
# Next, we print only the first of each "type"...
if [[ ${a[$type]} -eq 0 ]]; then
a[$type]=1
echo "$file"
fi
# And stop once we have collected three types.
if [[ ${#a[*]} -ge 3 ]]; then
break
fi
done

正如我所说,这不处理文件名中的换行符。

另请注意,这使用 revsort ,它们不是内置于 bash 中的。 rev部分可以在内部完成,使用更多代码,这可能会使它们执行得更快,但您只会在非常极端的情况下看到差异。我们无能为力 sort ,因为 bash 中没有内置。

关于bash - 需要使用 Shell 脚本从目录中选择最新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com