如何从list.txt读取文件名批量创建空文件?附尝试代码
批量从list.txt读取文件名创建空文件的正确方法
嘿,我来帮你搞定这个批量创建文件的问题!先说说你原来代码里的几个小问题:
- 数组赋值方式不对:
declare -a siglist=$(cat list.txt)会把整个文件内容当成数组的单个元素,而不是每行对应一个文件名 for fname in {list}是语法错误,这里你应该是想遍历数组,但写法有误- 用
echo $fname > "$fname.zz"会在文件里写入内容(文件名+换行),不是真正的空文件
下面给你几个靠谱的实现方式:
方法一:推荐!逐行读取文件(支持含空格/特殊字符的文件名)
这是最稳健的方式,能处理各种复杂的文件名:
while IFS= read -r fname; do # touch 用来创建空文件,若文件已存在则更新时间戳 touch "$fname.zz" done < list.txt
IFS=:防止文件名开头的空格被截断-r:禁止把反斜杠当成转义字符,避免文件名里的反斜杠被错误处理< list.txt:把list.txt作为while循环的输入源
方法二:用数组存储文件名再遍历
如果你确实想用数组来管理文件名,可以这么写:
# 把list.txt的每行读取到数组siglist中,-t 去掉每行末尾的换行符 readarray -t siglist < list.txt # 遍历数组里的每个文件名 for fname in "${siglist[@]}"; do touch "$fname.zz" done
注意一定要用"${siglist[@]}"来遍历,这样每个数组元素都会被正确识别,哪怕文件名里有空格。
方法三:用xargs快速处理(适合无特殊字符的简单文件名)
如果你的文件名里没有空格、引号这类特殊字符,用xargs会更简洁:
xargs -I {} touch "{}.zz" < list.txt
-I {}表示用每行内容替换掉命令里的{},然后执行touch命令。
另外补充一下:如果你只是想创建完全空的文件,touch是最佳选择;如果用echo > "$fname.zz",文件里会有一个换行符,严格来说不是空文件哦~
内容的提问来源于stack exchange,提问作者Gamarlinsky
相关产品推荐
相关产品推荐

