1

我有一个命令:

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
...
4

3 回答 3

1

两个连接每对相邻的线只是将您的输出通过管道awk 'NR%2{line=$0;next}{print line sep $0}' sep=" >> "调整sep到您的需要。

附录:

针对原作者的评论,我将解释这个解决方案的一些细节:

awk逐行处理输入,没有进一步的选项。(内部)变量NR存储当前记录的编号。%是模运算符,因此对于奇数行号和偶数行号NR%2求值。将要执行的命令(所谓的“动作”)分组。由于被认为是“真”和“假”,因此仅对奇数行号执行第一个操作。该动作由两个命令组成:首先,将整行 ( ) 存储在变量中,然后处理记录(不考虑任何其他动作)。对于偶数行,不执行此操作,因此考虑第二个操作。由于前面没有表达式10{...}10$0linenext{执行操作:存储的(即前一个)line与一个名为的变量sep和当前行 ( $0) 连接。结果字符串被打印(并在最后自动附加一个换行符)。的值作为参数sep传递awk给它,以便在不弄乱脚本的情况下轻松调整它。由于awk无需进一步参数即可读取标准输入和输出,因此您只需|将 find 的输出通过管道 ( ) 传递到awk( find ... -exec ... -exec ... | awk ... > ...)

于 2013-07-29T13:56:05.787 回答
1

像这样的命令怎么样

echo "$(ls -hastl '{}') >> $(md5sum '{}')"
于 2013-07-29T13:33:54.230 回答
0

IMHO You can only execute one command with exec. A possible solution might be you execute "sh -c" so you can use pipes and similar:

With one newline at the end:

find /etc -type f -exec sh -c "/bin/ls -hastl '{}' | tr '\n' ' '" \; -exec /usr/bin/md5sum '{}' \;

without any newline:

find /etc -type f -exec sh -c "/bin/ls -hastl '{}' | tr '\n' ' '" \; -exec sh -c "/usr/bin/md5sum '{}'| tr -d '\n' " \;
于 2013-07-29T13:36:44.157 回答