크기가 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"로 묶겠습니다. 이는 세 가지 매개변수를 사용하는 단일 "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
읽기 쉽도록 "쉘 찾기" 명령을 여러 줄로 나누었지만 한 줄(긴)로 축소할 수도 있습니다. 추가적인 음모가 있습니다오직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"' _ '{}' \;