連想配列をサポートする Bash 4 を使用している場合:
#!/bin/bash
declare -A languages
languages["English"]=en
languages["Arabic"]=ar
languages["French"]=fr
languages["Russian"]=ru
for language in "${!languages[@]}"
do
for file in MyFile*."${languages[language]}"
do
rmflag=false
for compare in "${!languages[@]}"
do
compfile=compare/${file##*/}
compfile=${compfile%.${languages[language]}}.${languages[compare]}
if ! $rmflag && [[ ! -e $compfile ]]
then
rm "$file"
rmflag=true
elif $rmflag && [[ -e $compfile ]]
then
rm "$compfile"
fi
done
done
done
これはテストされておらず、準拠していないファイルがあるMyFile*.{en,ar,fr,ru}
場合、またはメイン ディレクトリの下にディレクトリがある場合、希望どおりに動作しない可能性があります。
Bash 3 または 4 で動作するはずの別のバージョンを次に示します。
#!/bin/bash
for dir in English Arabic French Russian
do
for file in "$dir"/*
do
base=${file##*/}
base=${base%.*}
files=({English,Arabic,French,Russian}/"$base".{en,ar,fr,ru})
if (( ${#files[@]} != 4 ))
then
rm -f {English,Arabic,French,Russian}/"$base".{en,ar,fr,ru}
fi
done
done
繰り返しますが、テストされていません。以前と同じ条件下で、またはファイルが間違った場所にある場合 (たとえば、イギリス人がフランスを訪れた場合など) は、期待どおりの結果が得られない可能性があります。;-)