나는 많은 것을 포함하는 디렉토리 트리를 가지고 있습니다..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