나는 주어진 디렉터리에서 중복 파일을 찾기 위해 SHA1 탐지 일치를 사용하는 간단한 bash 쉘 스크립트를 작성하기 시작했습니다. 공백이 있는 파일 이름을 만날 때까지는 모든 것이 잘 작동합니다. 감지는 여전히 작동하지만 출력에서 공백은 줄바꿈으로 변환됩니다.
스크립트...
#!/bin/bash
export TARGET=$1
find $TARGET -type f -exec openssl sha1 \{\} \; > ./dupes.txt
COUNT=-1
for EVALUATION in `cat ./dupes.txt | sed 's/SHA1(\(.*\))\= \(.*\)$/\2 \1/' | awk '{print $1}' | sort | uniq -c | sort -nr`
do
if [[ $COUNT == -1 ]]
then
COUNT=$EVALUATION
else
HASH=$EVALUATION
if [[ $COUNT == 1 ]]
then
break
fi
echo "--- duplicate set ---"
for FILE in `grep $HASH ./dupes.txt | awk -F"[()]+" '{print $2}'`
do
echo "$FILE"
done
echo "---------------------"
COUNT=-1
fi
done
스크립트를 실행하는 것은 다음과 같습니다.
./dupes.sh /home/dacracot/testDupes
다음과 같은 dupes.txt 파일이 생성됩니다.
SHA1(/home/dacracot/testDupes/lP3wj.jpg)= 324d91f412745481ed38aa184e5a56bfc3bf43b5
SHA1(/home/dacracot/testDupes/1673.gif)= 9c4029ec2e310f202b413d685209373d234e5465
SHA1(/home/dacracot/testDupes/.DS_Store)= b0ae6631a1412863f958da64091f4050005bf8d6
SHA1(/home/dacracot/testDupes/tae 2.svg)= 3ddc4fd6ae505bd01f370d0a018ef1f84b4d8011
SHA1(/home/dacracot/testDupes/tae.graffle)= 77f1ad6d695d944abacfe3a7f196be77125b6ef6
SHA1(/home/dacracot/testDupes/tae.svg)= 3ddc4fd6ae505bd01f370d0a018ef1f84b4d8011
SHA1(/home/dacracot/testDupes/22402_graph.jpg)= 24e5a25c8abf322d424dd5ce2e5b77381cd001c4
SHA1(/home/dacracot/testDupes/forwardcont.jpg)= 981e75060ae8e3aad2fe741b944d97219c8ccbe5
SHA1(/home/dacracot/testDupes/tae.svg.gz)= 922af5a5adbf7a4e7fd234aac7bcee2986133c4d
SHA1(/home/dacracot/testDupes/Alt2012.pdf)= 97d1fd997df9eb310b30a371c53883f5227cf10a
SHA1(/home/dacracot/testDupes/vcBZ8.jpg)= 7553c19fcb6aa159aada2e38066b5ba84465ee57
SHA1(/home/dacracot/testDupes/derm.graffle)= 0e1c4032f5f1fadc3a1643b2b77f816011c2d67f
SHA1(/home/dacracot/testDupes/WA.png)= 0e2e77624c3a76da4816f116665a041f6bdced2d
SHA1(/home/dacracot/testDupes/DRAW.GIF)= 6a8e4a2bf413e84140a0edeb40b475a5d3e4c255
SHA1(/home/dacracot/testDupes/crazyTalk.gif)= 1d938bbcb8cf09f30492df4504a50348cef7ea9d
최종 출력은 다음과 같습니다.
--- duplicate set ---
/home/dacracot/testDupes/tae
2.svg
/home/dacracot/testDupes/tae.svg
---------------------
하지만 첫 번째 파일에서 볼 수 있듯이 출력은 다음과 같아야 합니다.
--- duplicate set ---
/home/dacracot/testDupes/tae 2.svg
/home/dacracot/testDupes/tae.svg
---------------------
공백을 줄 바꿈으로 바꾸는 것은 무엇입니까?
답변1
다음은 문제를 설명하는 더 간단한 예입니다.
$ cat input.txt
line one
line two
line three
$ for word in $(cat input.txt) ; do echo $word ; done
line
one
line
two
line
three
$(cat input.txt)
입력을 공백으로 분할합니다 . (그런데 bash에서는 이것을 로 바꿀 수 있습니다 $(<input.txt)
).
read
대신 내장 명령을 사용할 수 있습니다 .
$ while read line ; do echo "$line" ; done < input.txt
line one
line two
line three
(어차피 awk를 사용하고 있으므로 awk나 다른 스크립트 언어로 전체 내용을 다시 작성하는 것을 고려할 수도 있습니다.)