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=" >> "Two join は、隣接する行のすべてのペアを結合して、必要に応じて出力をパイプするだけsepです。

補遺:

元の著者のコメントに応えて、このソリューションの詳細を説明します。

awk行単位の追加オプションなしで、入力をレコードごとに処理します。(内部) 変数NRは、現在のレコードの番号を格納します。%はモジュラス演算子であるため、奇数行番号と偶数行番号に対してNR%2評価されます。実行するコマンド (いわゆる「アクション」) をグループ化します。は「真」および「偽」と見なされるため、最初のアクションは奇数行番号に対してのみ実行されます。このアクションは 2 つのコマンドで構成されます。まず、行全体 ( ) が変数に格納され、次にレコードが処理されます (他のアクションは考慮されません)。偶数行の場合、このアクションは実行されないため、2 番目のアクションが考慮されます。の前に式がないので、10{...}10$0linenext{アクションが実行されます: 保存された (つまり、前の)lineは、呼び出された変数とsep現在の行 ( $0) と連結されます。結果の文字列が出力されます (最後に1 つの改行が自動的に追加されます)。の値は、スクリプトをいじらずに簡単に調整できるようにパラメーターとしてsep渡されます。awkそれawk以上の引数なしで標準入力と出力を読み取るため|、検索結果の出力を ( ) にパイプするだけで済みますawk( find ... -exec ... -exec ... | awk ... > ...)

于 2013-07-29T13:56:05.787 に答える
1

のようなコマンドはどうでしょうか。

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

IMHO execで実行できるコマンドは1つだけです。可能な解決策は、「sh -c」を実行して、パイプなどを使用できるようにすることです。

最後に 1 つの改行がある場合:

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' " \;
于 2013-07-29T13:36:44.157 に答える