从txt文件每行创建新文件,避免文件名太长

从txt文件每行创建新文件,避免文件名太长

我正在为 .txt 文件中的每一行文本创建新文件

file=/tmp/textFile.txt
while IFS= read -r line
do
        printf "%s\n" "$line" > /tmp/"$line"txt
done < "$file"

我总是收到一条错误消息,指出文件名太长,是否有办法将新文件的标题缩短到一定数量的字符?

答案1

使用igawk将行的内容输出到最多 100 个字符的文件名(前面是/tmp/,后面是.txt):

awk '{ name = "/tmp/" substr($0,1,100) ".txt"; print >name; close(name) }' /tmp/textFile.txt

例如,如果您需要对每个名称中的/和字符执行某些操作,请将它们更改为下划线(这可以避免覆盖文件系统中除目录中的文件之外的随机文件):./tmp

awk '{ name = "/tmp/" substr($0,1,100) ".txt"; gsub("[/.]","_",name); print >name; close(name) }' /tmp/textFile.txt

答案2

您可以将行截断为例如 252 个字符(txt添加后将变为 255 个)。

while IFS= read -r line
do
    printf "%s\n" "$line" > /tmp/"${line:0:252}"txt
done< /tmp/textFile.txt

参数扩展来自 ksh93,也受 Bash 和更新版本的 zsh 支持,但不能移植到sh.原生 zsh 语法是$line[1,252]or ${line[1,252]},后者也受yash.

无论如何,根据文件系统,极限往往是在数量上字节而不是数量人物1,如果文本包含多字节字符,上述方法可能无法正常工作。


1 macos 可能会增加更多的复杂性,因为它可能会将字符(例如带有变音符号的字符)分解为存储字符(例如éU+0065 和 U+0301)的分解形式,而不仅仅是 U+00E9 预组合形式。

相关内容