당신은 연관 배열을 지원 배쉬 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}
을 준수하지 않거나 파일이 있으면 원하는 것을 할 수 없습니다 디렉토리. 검증되지 않은, 다시
#!/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
:
다음은 배쉬 3 또는 4 작동해야 다른 버전입니다. 이전과 같은 조건에서 또는 잘못된 장소에 파일이있는 경우 (예 : 영국인이 프랑스를 방문하는 경우) 원하는대로 할 수 없습니다. ;-)
'남자 basename' 유닉스에 있다는 점 유의 하시길 바랍니다 더 "확장"없다. 마침표는 다른 문자와 마찬가지로 이름에 유효한 문자이며 이름에는 마침표가 두 개 이상있을 수 있습니다. (슬래시와 NUL은 파일 이름에서 금지되거나 불가능하며 이름은 "."과 ".."가 예약되어 있습니다.) – wildplasser
@wildplasser : 그것은 pedantic입니다. 유닉스는 확장 기능을 가지고 있지 않을 수도 있지만, 유닉스 사용자는 그것들을 다루기 때문에 용어를 사용할 때'\. [^.] + $'을 의미합니다. –
난 상관 없어. 그것은 DOS 사용자들처럼 모든 세계가 8.3 개의 대소 문자를 사용한다고 가정하는 것과 같은 의미입니다. 숨어있는 진짜 문제는 두 개의 점이있는 파일 이름이 소프트웨어 (예 : OP 스크립트)를 혼동시킬 수 있다는 것입니다. – wildplasser