1

コードを実行すると、次のサンプル データが表示されます

md5deep find * | awk '{ print $1 }'

出力のサンプル

    /Users/math/Documents/Articles/Number theory: Is a directory
    258fe6853b1bfb2d07f512ff6bec52b1
    /Users/math/Documents/Articles/Probability and statistics: Is a directory
    4811bfb2ad04b9f4318049c01ebb52ef
    8aae4ac3694658cf90005dbdea37b4d5
    258fe6853b1bfb2d07f512ff6bec52b1

Is a directoryを含む行をSEDでフィルタリングしようとしましたが失敗しました

md5deep find * | awk '{ print $1 }' | sed s/\/*//g

そのサンプル出力は

/Users/math/Documents/Articles/Number theory: Is a directory
/Users/math/Documents/Articles/Topology: Is a directory
/Users/math/Documents/Articles/useful: Is a directory

SED/AWK で「Is a directory」を含む各行を除外するにはどうすればよいですか?

[明確化] Is a directory を含む行を除外したい。

4

4 に答える 4

2

ツールを使用したことはありませんがmd5deep、これらの行はエラー メッセージだと思います。それらは標準出力ではなく標準エラーに送られるため、パイプを介するのではなく、端末に直接送られます。したがって、それらは sed コマンドによってフィルタリングされません。標準エラーと標準出力ストリームをマージすることでそれらをフィルタリングできますが、

あなたが電話しようとしているように見えます(逆引用符がないためわかりません)

md5deep `find *`

find はすべてのファイルとディレクトリを返します。

あなたがしたいかもしれないことに関するいくつかのメモ:

  • md5deep「再帰的」オプションの -r があるようです。したがって、次のことを試してみてください。

    md5deep -r *
    

    find コマンドの代わりに。

  • findコマンドを使用したい場合は-type f、ファイルとディレクトリではなく、 を使用してファイルのみに制限できます。また、find コマンドに渡す必要はありません(理解できるオプションのように見える名前のファイルがあると*混乱する可能性があります)。を渡すと、現在のディレクトリを再帰的に検索します。findfind.

    find . -type f
    
  • sedパターンでスラッシュを使用したい場合は、\ で正しく引用するのが面倒な場合があります。代わりに、別の文字を選択して正規表現を区切ることができます。sedコマンドの後の最初の文字をs区切り文字として使用します。あなたのパターンにも.;がありません。正規表現では、 を使用する任意の文字の 1 つのインスタンスを示し、 を使用.する「直前の式の 0 個以上」を示す*ため、.*「任意の文字の 0 個以上」を示します (これはグロブ パターンとは異なります*。 「ゼロ個以上の任意の文字」を意味します)。

    sed "s|/.*||g"
    
  • 標準出力に標準エラーストリームを含めたい場合は、パイプを通過するようにするには、次を実行できます。

    md5deep `find *` 2>&1 | awk ... 
    
  • stderr を無視したいだけの場合は、それを にリダイレクトできます/dev/null。これは、そこに入ったものをすべて破棄する特別なファイルです。

    md5deep `find *` 2>/dev/null | awk ...
    

要約すると、以下のコマンドが差し迫った問題の解決に役立つと思います。探しているものを理解していない場合は、上記の他の提案が役立つ場合があります。

md5deep -r * | awk '{ print $1 }'
于 2009-03-24T19:12:56.833 に答える
2

明確化に具体的に答えるには:awkとsedを使用して行を除外する方法:

awk '/Is a directory/ {next} {print}'
sed 'g/Is a directory/d'
于 2009-03-25T20:38:43.500 に答える
1

代わりに grep を使用しないのはなぜですか?

つまり、

md5deep find * | grep "Is a directory" | awk '{ print $1 }'

編集:私はあなたの質問を読み直しました。Is a directory の行を削除したい場合は、grep の -v フラグを使用します。

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }'
于 2009-03-24T18:51:23.390 に答える
0

私はmd5deepに精通していませんが、これあなたがやろうとしているようなことをするかもしれません.

find -type f -exec md5sum {} +
于 2009-03-24T19:00:08.643 に答える