我创建了一个脚本,用于检查文件是否在Downloads文件夹中。然后它会将文件复制到所需的位置,然后将其重命名为其他位置。
我是通过以下方式完成的:
if [ -f /home/$username/Downloads/Framework\ Code\ Note\ $1.txt ]; then
cp /home/$username/Downloads/Framework\ Code\ Note\ $1.txt /home/$username/Documents/TASKS/Framework/$3/$2/
mv Framework\ Code\ Note\ $1.odt Framework\ Code\ Note\ $2.odt
else
echo "The file does not exist yet Download the latest notes from your email"
fi
问题是我通常有相同文件名的不同版本,需要从电子邮件中下载最新文件。因此名称成为框架代码注释10.txt,框架代码注释10(1).txt框架代码注释10(2).txt等...
如何将其修改为仅从我的下载文件夹中提取最新的Notes(如果可能)?
答案 0 :(得分:0)
要获取文件的最新版本(例如Framework Code Note 10(X).txt
,其中X最大),您可以使用以下内容:
IFS=$'\n' MYARRAY=($( printf "%s\n" "/path/to/downloads/Framework Code Note $1"*.txt | sort -nr -t '(' -k 2 ))
cp "${MYARRAY[0]}" /my/destination/folder
当你分解时:
printf "%s\n" "/path/to/downloads/Framework Code Note $1"*.txt
查找下载目录中以“Framework Code Note Y”开头的所有文件,其中Y是$1
的值。这样,Framework Code Note 10(X).txt
和Framework Code Note 10.txt
就匹配了。
sort -nr -t '(' -k 2
考虑到第二列(-n
),按数字顺序(k 2
)对生成的文件进行排序。每列的分隔符为'('(-t '('
),然后结果反转,以便第一个结果的编号最高(-r
)
命令的输出存储在$MYARRAY
中。然后在读取数组的第一个元素时提取最高版本号
IFS=$'\n':
将内部字段分隔符设置为\n
,仅适用于此行。 bash使用此变量来了解参数是如何分离的,其默认值为\n\t
。这意味着当我们将值分配给$MYARRAY
时,如果名称包含空格,则将其视为分隔符(即,如果您只有Framework Code Note 10.txt
,Framework
将存储到MYARRAY[0]
,Code
到MYARRAY[1]
,等等。由于归因是内联完成的,$IFS
会在执行后恢复为默认值