我正在为 .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 预组合形式。