我有一个目录,其中包含一些无意义的命名文件,例如:
apple_2020-01-01.txt
apple_2020-01-02.txt
orange_2020-01-01.txt
pear_2020-01-02.txt
pear_2020-01-03.txt
pear_2020-01-04.txt
我想使用 bash 脚本根据文件上的时间戳创建一些新文件,每个唯一时间戳一个文件。
我可以做出一些假设:
1)文件名将始终遵循fruit_*.txt的格式
2) 文件将被命名为 apple、orange 或 pear
3) 时间戳始终采用 YYYY-MM-DD 格式。
根据上面的示例文件,我希望脚本创建以下文件:
NewFile_2020-01-01.txt
NewFile_2020-01-02.txt
NewFile_2020-01-03.txt
NewFile_2020-01-04.txt
我怎样才能实现这个目标?
答案1
#!/bin/bash
shopt -s nullglob
for file in {apple,pear,orange}_*.txt; do
touch "NewFile_${file##*_}";
done
对于每个文件,我们删除前导部分直到下划线字符,因此只留下时间戳和扩展名,然后添加NewFile_
到结果中。
touch
如果它尝试创建一个已经存在的文件,则不会抱怨。
如果下划线后有空格,此解决方案也适用。
答案2
#!/bin/bash
printf '%s\n' {apple,orange,pear}_*.txt |
sed 's/apple\|orange\|pear/NewFile' |
sort -u |
xargs touch
使用 shell glob 获取文件名(如果没有,这将失败,并且有数万个可能会出现问题),使用 sed 更改名称,然后使用 sort -u 删除重复项。
最后将它们提供给 xargs touch 以根据OP的澄清评论创建文件。
答案3
ls *.txt | cut -f2- -d_ | sort -u | xargs -IX touch NewFile_X
cut
给出第二个“字段”,其分隔符为_
sort
排序并删除受骗者(u
nique)xargs
运行命令touch
并替换X
为来自其他命令的命令