使用 bash 脚本根据现有文件创建文件

使用 bash 脚本根据现有文件创建文件

我有一个目录,其中包含一些无意义的命名文件,例如:

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排序并删除受骗者(unique)

  • xargs运行命令touch并替换X为来自其他命令的命令

相关内容