我有一个命令:
find /etc -type f \( ! -perm /o=w \) -exec /usr/bin/ls -hastl '{}' \; -exec /usr/bin/md5sum '{}' \; > somefile.log
并且此命令创建了这样的打印输出(我需要没有断行):
...
4.0K -rw-r--r--. 1 root root 332 Oct 23 2012 /etc/xinetd.d/rsync
fd32314f3157aaf15712e6da7758060d /etc/xinetd.d/rsync
....
问题:我必须添加到此命令中以删除新行操作以获得此类结果:
(...) is '-rw-r--r--. 1 root root 332 Oct 23 2012'
...
4.0K (...) /etc/xinetd.d/rsync >> fd32314f3157aaf15712e6da7758060d /etc/xinetd.d/rsync
...
答案 0 :(得分:1)
如
这样的命令怎么样?echo "$(ls -hastl '{}') >> $(md5sum '{}')"
答案 1 :(得分:1)
两个连接每对相邻的行,只需将输出传输到awk 'NR%2{line=$0;next}{print line sep $0}' sep=" >> "
,根据需要调整sep
。
<强>附录:强>
在回应原作者的评论时,我将解释这个解决方案的一些细节:
awk
以记录方式处理输入,没有逐行的其他选项。
(内部)变量NR
存储当前记录的编号。 %
是模数运算符,因此NR%2
的奇数行数为1
,偶数行的0
为{...}
。 1
对要执行的命令(所谓的“操作”)进行分组。由于0
被视为“true”而$0
为“false”,因此仅对奇数行执行第一个操作。此操作包含两个命令:首先,整行(line
)存储在变量next
中,然后处理{
记录(不考虑任何其他操作)。对于偶数行,不执行此操作,因此考虑第二个操作。由于在line
执行操作之前没有表达式:存储的(即先前的)sep
与名为$0
的变量和当前行(sep
)连接在一起。打印结果字符串(并在最后由一个换行符自动附加)。 awk
的值作为参数传递给awk
,以便在不弄乱脚本的情况下轻松调整它。由于|
在没有其他参数的情况下读取标准输入和输出,您只需将查找的输出(awk
)管道传输到find ... -exec ... -exec ... | awk ... > ...
({{1}})
答案 2 :(得分:0)
恕我直言你只能用exec执行一个命令。一个可能的解决方案可能是你执行“sh -c”,这样你就可以使用管道和类似的东西了:
最后有一个换行符:
find /etc -type f -exec sh -c "/bin/ls -hastl '{}' | tr '\n' ' '" \; -exec /usr/bin/md5sum '{}' \;
没有任何换行符:
find /etc -type f -exec sh -c "/bin/ls -hastl '{}' | tr '\n' ' '" \; -exec sh -c "/usr/bin/md5sum '{}'| tr -d '\n' " \;