![查找目录中文件名结尾与字符串匹配的最后一个文件](https://linux22.com/image/97332/%E6%9F%A5%E6%89%BE%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%96%87%E4%BB%B6%E5%90%8D%E7%BB%93%E5%B0%BE%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我正在编写一个脚本来创建/复制文件以加快工作流程。在这种情况下,需要在目录中搜索以特定字符串结尾的文件,如果找到一个或多个文件,则需要将序列中的最后一个作为复制目标。 (如果没有找到,脚本会从不同的目录复制一个新文件)。
该目录可以包含多组文件,这些文件都遵循以下格式;
YYYYMMDD_##_user_filename.json
因此示例文件夹可能包含以下内容;
20161021_01_test_parameters.json
20161021_01_test_stack.json
20161021_02_test_parameters.json
20161021_02_test_stack.json
20161022_03_test_parameters.json
20161025_04_test_parameters.json
20161025_04_test_stack.json
在这种情况下,我需要脚本读取以 结尾的任何文件parameters.json
,然后根据版本号(01、02 等)对它们进行排序,以发现哪个是序列中的最后一个。然后应使用下一个版本号将该文件复制到同一文件夹中。为此,日期是无关紧要的,您可以假设永远不会有重复的版本号。
我正在使用if [ -e $1/*"parameters.json" ]; then cp $1/*"parameters.json" "$FILENAME"_parameters.json
($1
这些文件正在移动的目录在哪里 - 很重要,因为脚本位于要执行操作的目录之外,并且$FILENAME
只是一个用于计算位置、日期、版本号等的变量)但是当然,这对于查找最新的没有任何作用。
答案1
由于您要排序的数字似乎始终是第二个下划线分隔的字段,因此您应该能够使用类似的内容
find path/to/dir/ -maxdepth 1 -name '*parameters.json' | sort -t_ -nk2,2 | tail -n1
如果您需要处理包含换行符的文件名的可能性,并且您的核心实用程序支持它,您可以将整个命令转为空分隔,例如
find path/to/dir/ -maxdepth 1 -name '*parameters.json' -print0 | sort -zt_ -nk2,2 | tail -zn1