Bash脚本从“Downloads”文件夹中复制文件

时间:2014-06-30 10:10:07

标签: bash

我创建了一个脚本,用于检查文件是否在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(如果可能)?

1 个答案:

答案 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).txtFramework 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.txtFramework将存储到MYARRAY[0]CodeMYARRAY[1],等等。由于归因是内联完成的,$IFS会在执行后恢复为默认值