サイズが30000〜50000バイトのディレクトリとサブディレクトリのすべてのファイルを表示したいです。
私のファイルを次のように表示したいと思います。
file1.xxx md5sum bytesize
file2.xxx md5sum bytesize
これはこれまでのコードです(コマンドでなければなりません)。
find /mnt/analysis -size +30000c -size -50000c -exec md5sum {} \; -exec ls -l {} \; | awk '{print $1 $5 $9}'
出力:
2fc863d4e42fcced35ce17cdbb9cb623
-rwxrwxrwx33673/mnt/analysis/bla/twelve.png
a952105e64609de5149db2da08e3256c
-rwxrwxrwx41412/mnt/analysis/bla/thirteen.png
希望の出力:
/mnt/analysis/bla/twelve.png 2fc863d4e42fcced35ce17cdbb9cb623 33673
/mnt/analysis/bla/thirteen.png a952105e64609de5149db2da08e3256c 41412
問題は、awkが両方のexecファイルで実行されることです。したがって、権限もそこに適用されます。
答え1
まずmd5sumを受け取ることができますか?
find /mnt/analysis -size +30000c -size -50000c -type f | xargs stat -c"echo \$(md5sum %n) %s" | sh
またはマイナス記号がある場合
find /mnt/analysis -size +30000c -size -50000c -type f | xargs stat -c"echo %n \$(md5sum <%n) %s" | sh
tr -d -
(もちろん、ファイル名がなければ追加して削除できます)
答え2
必要な方法でフォーマットを再指定するには、コードを「find shell」で囲みます。これは、3つのパラメータを使用する単一の「printf」コマンドにまとめられています。
- ファイル名
- ファイルの md5sum
- ファイルサイズ
このfind
コマンドは、一致する各ファイル名を "find shell"に引数()として渡すため、$1
各printf引数が実行する操作は次のとおりです。
find /mnt/analysis -size +30000c -size -50000c -type f -exec \
sh -c 'printf "%s %s %d\n" \
"$1" \
"$(md5sum "$1" | awk "{print \$1}")" \
"$(stat -c %s "$1")"' find-sh {} \;
md5sum(およびサイズを取得する呼び出し)から意味のある結果を得る-type f
ために、元のfindコマンドに制限を追加しました。stat
読みやすくするために「シェルを検索」コマンドを複数行に分割しましたが、1行(長い)に縮小することもできます。追加のプロットがありますただmd5sumコマンドのmd5sum要素は、「find shell」全体が一重引用符で囲まれているため、awkスクリプトに二重引用符を使用しました。これは$
awkが。$1
/some/file/here
答え3
find
++wc
ツールと組み合わせるcut
:
find /mnt/analysis -type f -size +30000c -size -50000c -exec \
bash -c 's=$(wc -c < "$1"); echo "$1 $(md5sum < "$1" | cut -d" " -f1) $s"' _ '{}' \;