如何使用gawk定义文件名后缀



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

$ grep Sounddsk2.img ls -a1 > filenames

和CCD_ 3以基于它们的词缀来识别不同的文件类型。filenames的短样本可以看起来像这个

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

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

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

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

在我尝试的第二个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的目录所需的条件

注意

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

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

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

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

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

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

或者如果你真的只想要gawk0文件,那么(再次未测试(:

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

如果这两个都不是你想要做的,那么请编辑你的问题以澄清你的要求。

最新更新