【问题标题】:how do I define a filename suffix using gawk如何使用 gawk 定义文件名后缀
【发布时间】:2021-05-25 09:19:44
【问题描述】:

我正在尝试检索四年前存档在Fairlight CMI 软盘上的文件。有许多磁盘,每个磁盘最多包含 80 个具有不同文件扩展名的文件,因此该过程需要自动化。我使用grep 来提取filenames 的列表,如下所示:

    $ grep Sounddsk2.img ls -a1 > filenames

gawk 以根据其词缀识别不同的文件类型。 filenames 的简短示例可能如下所示

    bass.co
    bass.ss
    bass.vc
    flute5.co
    flute5.ss
    flute5.vc
    guitar.co
    guitar.ss
    guitar.vc

gawk 将用于将filenames 中以.ss 结尾的文件的名称输出到名为ss 的目录中(基于我之前找到的here 问题的答案)(仍然接受答案打开,是的,我还在学习)

    $ gawk '/^([a-zA-Z0-9])\.ss$/' filenames > ss

我需要知道的是如何使用gawk 创建一个名为ss 的目录,我可以在其中保存从磁盘映像中提取的.ss 文件。 These questions 看起来很有希望,但答案毫无结果。

在我第二次尝试的gawk 脚本中,扫描filenames 以查找以.ss 结尾的文件,并计算记录分隔符(即.)。如果tally 不为零,则脚本会创建一个名为ss 的目录,其中提取的.ss 文件将被保存(最终)。

我试图通过将. 定义为记录分隔符来从文件名中分离后缀,但这可能不是正确的方法,因为如果下面的命令行不起作用ss 也出现在文件名中。

    $ gawk ‘BEGIN{RS=“[.]”; filetype= “ss”; tally=0}  index($1, “ss”){tally++} END{print tally; mkdir ss}’ filenames

并且在下面命令的下一个版本中,gawk 无法读取创建ss 目录所需的测试条件

    $ gawk ‘BEGIN{RS=“[.]”; filetype= “ss”; tally=0}  index($1, “ss”){tally++} END{if (tally >0) {mkdir ss}}’ filenames

所以我的问题是:

  1. 如何使用gawk 定义文件名后缀ss
  2. 如何测试创建名为ss 的目录所需的条件?

注意

这些示例中保存的是文件名而不是实际文件。拥有一个文件名列表将用于自动执行以下命令行,其中可执行文件aget 每个archivedfile 从软盘映像中生成一个localfile,就像这样

    $ a Sounddsk2.img get archived-file local-file.

我希望这一切都有意义。非常欢迎任何改进建议。谢谢。

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    awk 是一个操作文本的工具。操作(创建/销毁)文件(和进程)的工具是 shell。您正在尝试为您的工作使用错误的工具。

    听起来这就是你想要做的事情(未经测试):

    while IFS= read -r file; do
        sfx="${file##*.}"
        mkdir -p "$sfx" &&
        touch "$sfx/$file"
    done < filenames
    

    或者如果您真的只想要 .ss 文件,那么(再次未经测试):

    sfx='ss'
    grep "\.${sfx}$" filenames |
    xargs -n 1 -I {} sh -c 'mkdir -p '"$sfx"' && touch '"$sfx"'/{}'
    

    如果这些都不是您想要做的,那么请编辑您的问题以阐明您的要求。

    【讨论】:

    • Ed,这正是我需要的。选择错误的工具解释了为什么我遇到了这么多麻烦。谢谢
    猜你喜欢
    • 2021-08-06
    • 2020-05-04
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2010-09-17
    • 2020-10-16
    • 2012-08-15
    相关资源
    最近更新 更多