2017-11-08 14 views
0

ディレクトリから重複したファイルを削除したいと思います。私$PATH内のディレクトリで は、私は次を含むスクリプトremove_duplicatesを書いた:関数を含むbashスクリプトは何も実行しません

$:~/local/bin cat remove_duplicates 
#!/bin/bash 

remove_duplicates() { 
    for i in * 
    do 
# echo ${i} 
    if [ -e ${i}.~1~ ] 
    then 
     hash1=$(md5sum ${i} | awk '{print $1}') 
     hash2=$(md5sum ${i}.~1~ | awk '{print $1}') 
     if [ "$hash1" = "$hash2" ] 
     then 
     rm -v ${i}.~1~ 
     fi 
    fi 
    done 
} 

私は重複したファイルを含むディレクトリでスクリプトを実行すると、それは重複を削除しません。

からディレクトリ内のすべてのファイルが含まれるように拡大、すなわち(私は問題が私の forループで *の拡大にあるかもしれないと思うが、私はそれが正常に拡大するために取得するかどうかはわかりません
$:~/.vim/colors md5sum candycode* 
8b115e7b2ed03eb949c9c0b2cf049012 candycode.vim 
8b115e7b2ed03eb949c9c0b2cf049012 candycode.vim.~1~ 

$:~/.vim/colors which remove_duplicates 
~/local/bin/remove_duplicates 

$:~/.vim/colors remove_duplicates 

$:~/.vim/colors md5sum candycode* 
8b115e7b2ed03eb949c9c0b2cf049012 candycode.vim 
8b115e7b2ed03eb949c9c0b2cf049012 candycode.vim.~1~ 

スクリプトが呼び出されます)。
私はこれが問題のどこにあるのかと考えている理由は、スクリプトのecho ${i}行のコメントを外すと、stdoutに何も表示されないことがわかります。
*$PWD/*に置き換えようとしましたが、これは何もしないようです。

+1

あなたは、関数の呼び出しを追加するつもりでした? –

+1

私は、bash関数がどのように機能するかについて深刻な誤解を抱いていたと思います。関数を呼び出すために、ファイルに別の行を追加しました。これで、期待どおりに動作します。ありがとう! – kevin

+0

@DrorMoyal、eh? '[" $ foo "=" $ bar "]'は完全に正しいです。それは間違っています(POSIX shで)。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html –

答えて

2

関数を定義していますが、実行していません。

つまり、このスクリプトを実行すると、1行ずつ実行されて実行されます。これが達成するのは、remove_duplicatesという関数を定義することです。ファイルの最後に到達して完了します。

あなたはremove_duplicatesを呼び出す最後の行を追加するか、またはあなただけの最初の場所でそれの機能になり宣言を削除することができます

#!/bin/bash 

    for i in * 
    do 
# echo "${i}" 
    if [ -e "${i}.~1~" ] 
    then 
     hash1=$(md5sum "${i}" | awk '{print $1}') 
     hash2=$(md5sum "${i}.~1~" | awk '{print $1}') 
     if [ "$hash1" = "$hash2" ] 
     then 
     rm -v "${i}.~1~" 
     fi 
    fi 
    done 
+0

ありがとう! @Ignacioはこれを上記のコメントで言及し、これが問題を解決しました。私は、実行可能ファイルでのbash関数の使用についての基本的な誤解があったと思います。 – kevin

+0

@CharlesDuffy良いコール - 私はちょうどオリジナルをコピーして貼り付けましたが、潜在的に*非常に乱雑な間違いを修正するのは良い計画です。幸運にも、 'md5sum'コマンドが最初に破られるべきであるので、オリジナルは優雅に失敗するはずです。どちらのハッシュも失敗しない限り、一致する可能性があります... –

関連する問題