如何格式化&x27;ls-轻轨';并发送到bash中的文本文件
这是一个简单的格式问题,但我想不出答案 我有一个bash脚本,可以用通配符查找某些文件,打印到文件,然后发送电子邮件。我需要如何格式化&x27;ls-轻轨';并发送到bash中的文本文件,bash,format,printf,echo,ls,Bash,Format,Printf,Echo,Ls,这是一个简单的格式问题,但我想不出答案 我有一个bash脚本,可以用通配符查找某些文件,打印到文件,然后发送电子邮件。我需要ls-lrt$var*,但是我不能像你在屏幕上看到的那样让输出一行一行地清晰打印出来。我正在输出文件中查找: -rw-rw-r-- 1 user user 14173 Nov 30 06:39 20171129_file1.txt.gz<br> -rw-rw-r-- 1 user user 30954 Nov 30 06:39 20171129_file2.
ls-lrt$var*
,但是我不能像你在屏幕上看到的那样让输出一行一行地清晰打印出来。我正在输出文件中查找:
-rw-rw-r-- 1 user user 14173 Nov 30 06:39 20171129_file1.txt.gz<br>
-rw-rw-r-- 1 user user 30954 Nov 30 06:39 20171129_file2.txt.gz<br>
-rw-rw-r-- 1 user user 95933 Nov 30 07:01 20171129_file3.txt.gz<br>
-rw-rw-r-- 1 user user 399507 Nov 30 08:43 20171129_file4.txt.gz<br>
但文件输出的每个字段都有一个新行:
-rw-rw-r--
1
user
user
133119
Dec
1
07:06
20171130_filename.txt.gz
etc......
然后我用printf尝试了这个,它不像echo那样发送新行,但是四个文件都混在一起了
for f in `ls -ltr $var*`; do
printf "x $f" >> /tmp/mailtext
done
它在一行上生成所有输出:
x -rw-rw-r--x 1x userx userx 13318x Decx 1x 07:06x 20171130_filename1.txt.gzx -rw-rw-r--x 1x userx userx 30793x Decx 1x 07:06x 20171130_filename2.txt.gzx -rw-rw-r--x 1x userx userx 99811x Decx 1x 08:00x 20171130_filename3.txt.gzx -rw-rw-r--x 1x userx userx 41363x Decx 1x 08:10x 20171130_filename4.txt.gz
当然,我尝试了printf“x$f\n”,但它看起来就像第一次尝试中的一样
那么,有什么办法可以实现这个简单的格式化呢?谢谢大家! 正如您在这两项测试中意识到的那样,执行:
for i in `some command` ; do
...
done
根据$IFS对某些命令的输出进行解析和分词,然后逐个获取这些值。在您的例子中,它将被分割成空格,所以每个单词都是一个接一个地读的
您只需在文件中重定向命令的输出,只需执行以下操作:
ls -lrt "$var"* > somefile
请注意,我在“$var”周围添加了引号(在几乎所有情况下,这是一种很好的做法),并且我将*
保留在那些双引号之外,以便shell仍然将它解释为一个全局请求
如果希望逐行打印结果(中间有一些停顿),可以执行以下操作:
for file in "$var"* ; do
ls -lrt "$file" # mandatory double-quotes
sleep 1 # will sleep 1 second before looping
done | tee somefile # shows both on your screen AND sends to "somefile"
或其任何变体
这里请注意,我不解析ls的输出(例如:断开的方式:ls-lrt“$var”*| whil IFS=read-r行;do…;done
:如果任何文件名包含换行符,将无法正常工作,并且还有其他不良副作用)
相反,我直接使用了正确的方法:for循环让shell将相关的文件名逐个放入$file
var中
请参阅:(条目1)了解详细解释。为什么不
ls-ltr$var*>/tmpmailtext
?祝你好运。还有。请在你的问题中使用格式。啊,是的,这很有效,是的,我把这个问题搞得太复杂了!为我辩护,我只是在修改其他人的脚本,他有echols-lrt$var*
>>文件,所有的文件都很混乱。所以我试图解开它。无论如何,问题解决了。我知道答案很简单!:/@ChuckPedro:尝试没有什么丢脸的,你也可以这样学习:)我强烈建议你也浏览所有的BashPitts,并且在同一个网站上浏览BashGuide和BashFaq条目。欢迎使用shell编程(也欢迎来到这里。unix.stackexchange.com也是一个很好的地方,可以用来处理特定于shell的奇怪问题,特别是当它涉及到unix下面的任何东西(文件名等)时。)
for file in "$var"* ; do
ls -lrt "$file" # mandatory double-quotes
sleep 1 # will sleep 1 second before looping
done | tee somefile # shows both on your screen AND sends to "somefile"