我正在浏览一个文件列表,并使用for循环将所有输出重定向到单个文件。我的循环有效,但我正在寻找一种方法来在每个文件的内容被转储之前添加描述符行,并在每个新文件条目之前添加一个空格。这是我的剧本。
#!/bin/bash
files=$(ls -l /home/user/*.txt | awk 'NR>=2 {print $9}')
for i in $files; do /bin/cat "$i" >> "/home/user/catfiles.txt"
done
我的输出如下:
spawn ssh user@x.x.x.x
run $command
quit
spawn ssh user@x.x.x.x
run $command
quit
我希望它看起来像这样:
"Description for first file here"
spawn ssh user@x.x.x.x
run $command
quit
<space>
"Description for second file here"
spawn ssh user@x.x.x.x
run $command
quit
<space>
更新:文件描述名称需要使用实际文件名按文件而变化。
"This is $file1"
"This is $file2"
etc,etc..
答案 0 :(得分:1)
所以你想要这个,BTW你的files=$(ls -l /home/user/*.txt | awk 'NR>=2 {print $9}')
错了,don't parse ls输出,jus使用shell:
for i in /home/user/*.txt; do
echo "Description for first file here $i" >> /home/user/catfiles.txt
/bin/cat "$i" >> "/home/user/catfiles.txt"
echo >> /home/user/catfiles.txt
done
答案 1 :(得分:1)
这将根据您的需要合并它们:
for f in /home/user/*.txt;do
echo "This is ${f##*/}" >> /home/user/catfiles.txt
/bin/cat "${f}" >> /home/user/catfiles.txt
echo >> /home/user/catfiles.txt
done
文件名打印,不带路径。如果您还希望打印路径,则只需将${f##*/}
替换为${f}
。
<强>更新强>
${variable##pattern}
称为参数替换。 Bash将在pattern
中搜索variable
并删除最长匹配。在这种情况下,变量为f
,模式为*/
,它匹配任何以斜杠结尾的String。双重哈希##
表示删除f
中可由*/
匹配的最长字符串。由于f
是一个路径,因此它会匹配并删除所有内容,包括最后一个/
,因此只保留文件名。
Bash documentation有关于此主题的更详细信息。或者,您可以在man bash
中搜索Parameter Expansion
。
答案 2 :(得分:0)
这将解决问题:
for i in /home/user/*; do
echo "This is from $i" >> "/home/user/catfiles.txt"
/bin/cat "$i" >> "/home/user/catfiles.txt"
echo >> "/home/user/catfiles.txt"
done
因为&#34;我&#34;在这种情况下代表每个文件,以echo开头的第二行中的$ i将为您提供不同的文件名。
如果要排除文件路径,以便该行只具有不带/ home / user的文件名,则可以在第3行之后插入sed语句。
for i in /home/user/*; do
echo "This is from $i" >> "/home/user/catfiles.txt"
/bin/cat "$i" >> "/home/user/catfiles.txt"
/bin/sed -i -e 's/\/home\/user\///g' /home/user/catfiles.txt
echo >> "/home/user/catfiles.txt"
done