我有很多以数字开头然后用说明连字符连接的文件。例如:
001 - awesomesauce 216 - stillawesomesauce
它们按子目录组织
那么,我将如何使用bash
脚本或这些目录中的一些内置查看来查看是否按顺序丢失了某个数字?即报告我在上面的示例中缺少002
、等。128
我知道我可以ls {000..216}\ -*
,它会列出文件,如果找不到它会抛出错误,但是有没有更好的方法来获取丢失的文件并递归执行?
答案1
在gnu
设置上你可以运行:
myarr=( $(find . -type f -name '[0-9][0-9][0-9]*' -printf '%f\n' | cut -c1-3 | sort -n) )
join -v1 <(seq -w ${myarr[-1]}) <(printf '%s\n' ${myarr[@]})
或者,使用zsh
,您可以尝试这样的操作:
myarr=( **/[0-9][0-9][0-9]*(.one_'REPLY=${${REPLY:t}:0:3}'_) )
mynums=( {001..$myarr[-1]} )
print -l ${mynums:|myarr}
它从每个文件名中提取数字(前三位),对它们进行排序并将结果保存在数组中 - myarr
。然后它设置另一个数组 -mynums
包含从001
最后一个索引的值开始的数字(即从文件名中提取的最大数字),然后使用参数扩展myarr
从 的扩展中删除 中的值mynums
。
答案2
我写findmissing
Python 脚本就是这样做的。我在 macOS 上开发了它,但它应该可以在任何平台上运行。我测试了使用 Python 2.7 和 3.6 运行它。
这是我的脚本的实际效果:
$ cat sampleFile.txt | python findmissing.py -p "DSC003\.(\d+)"
12
13
14
16
17
18
22
23
24
...提供以下文件时输出:
Id Name Type Size Created
1Dgt5ZFKT3zilwPZdiPyPmhM0Y3Fz_xo8 DSC003.010 bin 1.1 GB 2018-06-12 16:57:14
16QPadXBXPGIwiRhzMFRuY7tZkdIlJ1DI DSC003.011 bin 1.1 GB 2018-06-12 16:54:57
1zD492J3F42Azeoct82DMlXRRuWA8AUiY DSC003.015 bin 1.1 GB 2018-06-12 17:32:12
1bah8OM_F49BNeoct8M2DlXRRuOD8AUiY DSC003.019 bin 1.1 GB 2018-06-12 17:24:41
1eZfY4qn3Ol6w1BFafQn6YDy1uOU82NNA DSC003.020 bin 1.1 GB 2018-06-12 17:21:46
1x-P84Jq1cyuJCW2Opvy4m_qOjOHvAKtA DSC003.021 bin 1.1 GB 2018-06-12 17:27:16
1O4TjR8Cl31A5qxHkyVmhmukp4dofCO3t DSC003.025 bin 1.1 GB 2018-06-12 17:36:00