find 및 xargs를 사용하여 md5 기반 대상 이름이 있는 파일 복사

find 및 xargs를 사용하여 md5 기반 대상 이름이 있는 파일 복사

나는 많은 것을 포함하는 디렉토리 트리를 가지고 있습니다..dat파일에는 특수 문자가 많이 포함되어 있습니다. ASCII 문자가 포함된 파일만 처리할 수 있는 다른 프로세스에서 사용됩니다.

내 생각은 find모든 파일을 가져와서 md5파일 경로의 해시를 기반으로 새 파일 이름을 만들고 새 디렉터리에 복사하는 것입니다(그들은 그다지 크지 않으며 원래 디렉터리를 변경하지 않을 것입니다).

내가 시도한 것은 다음과 같습니다.

find dat -type f -name "*.dat" -print0|xargs -0 -I file cp 'file' "datnew/$(echo file|md5).dat"

안타깝게도 해시만 빌드하고 모든 파일을 해당 출력 파일 이름으로 복사합니다.

$ touch dat/foo.dat
$ touch dat/bar.dat
$ find dat -type f -name "*.dat" -print0|xargs -0 -I file cp 'file' "datnew/$(echo file|md5).dat"
$ ls datnew
bbe02f946d5455d74616fc9777557c22.dat

내 실수가 무엇인지 말해 줄 수 있나요? 제가 xargs잘못 사용하고 있는 것은 아닐까요 ?

답변1

file설명 되지 않으므로 해결 $( echo $file | md5 )방법이 필요합니다.

한 가지 가능성은 단순히 루프에 입력 while하고 각 출력을 읽는 것입니다. 이 경우 xargs전체적으로 건너뛰는 것이 좋습니다.

find ... | while read file ; do cp "$file" "datnew/$( echo "$file" | md5 )" ; done

이를 사용하려면 -print0다음 명령을 사용하여 null 문자를 줄 바꿈으로 바꾸십시오.tr

find ... -print0 | tr '\000\' '\n' | while read ; do ... ; done

관련 정보