2013-11-27 2 views
0

이것은 내 최초의 bash 스크립트이며 모든 주름을 제거하고 스크립트를 멋지게 실행하려고합니다. 스크립트는 HDD/플래시 드라이브의 여러 디렉토리에서 찾은 지정된 .jpg 파일을 모두 아카이브하는 것입니다. 이름이 같지만 내용이 다른 파일이 있으므로 Md5 합계를 사용하여 해시했습니다.Md5 이미지를 식별하고 보관하기위한 해시

Geany에 디렉토리가 존재하지 않지만 오류가 발생했지만 두 개의 이미지가 누락 된 명령 행에서 정상적으로 실행됩니다. 나는 그것을 고칠 생각이있는 모든 것을 시도했다. 이 일을하는 지저분한 코드입니까?

#!/bin/sh 

if [ ! -d "$1" ]; then 
    echo Directory "$1" cannot be found. Please try again. 
    exit 
fi 

if [ $# -eq 1 ]; then 
    echo "usage: Phar image_path archive_path" 
    exit 
fi 

if [ -d "$2" ]; then 
    echo "archive exists" 
else 
    echo "the directory 'archive' does't exist. Creating directory 'archive'." 
    mkdir -p ~/archive 
fi 

find $1 -iname "IMG_[0-9][0-9][0-9][0-9].JPG" | cat > list.txt 

[ -f ~/my-documents/md5.txt ] && rm md5.txt || break 
while read line; 
    do md5sum $line | xargs >> md5.txt 
done < list.txt 

sort -k 1,1 -u md5.txt | cat > uniquemd5.txt 
cut -d " " -f 2- uniquemd5.txt > uniquelist.txt 

sort uniquelist.txt -r -o uniquelist.txt 
for line in $(cat uniquelist.txt) 
do 
    file=$(basename $line) path="$2/file" 

    if [ ! -f $path ]; 
    then 
     cp $line $2 
else 
     cp $line $path.JPG 


    fi 

done 
+0

Geany에서 호출 할 때 대화 형 쉘에서 작동한다고 말하는가? Geany가 어떤 작업 디렉토리와 인수를 호출했는지 확인 했습니까? (또한 fdupes 만 사용할 수 있다면). –

+0

아마도 33 행에'path = "$ 2/$ file"'을 써야 할 것입니다. –

+1

또한 http://www.shellcheck.net/을 사용하여 일반적인 실수를 확인할 수 있습니다. –

답변

1

모든 폴더와 파일 이름의 공백을 방지하지 못했습니다.

예를 들어 :

cp $line $2 

은 다음과 같아야합니다

cp "$line" "$2" 
당신이 참조하는 각 변수를 평가하고 ""를 추가하여 오류 소스로이 공간을 제거하여 시작해야

의 .

오류가 계속 발생하면 사용 된 인수와 존재하지 않는 디렉토리를 제공해주십시오.