Bash 파일 이름 확장자 제한

Bash 파일 이름 확장자 제한

USB 볼륨에 파일을 쓰기 위해 "?", """, "*" 또는 ":"가 포함된 파일 이름을 바꾸고 이러한 문자를 공백으로 바꾸고 싶습니다. 그런데 "*"를 사용하고 있습니다. 내 bash 스크립트가

for file in * 
do 
    mv -v "'"$file"'" "'"$(echo "$file" | sed 's/\(.*\)[?"*:]\(.*\)/\1 \2/')"'" 
done

"*"는 현재 디렉터리의 파일 이름으로 계속 확장됩니다. 나는 사용해 보았습니다.

set -f

그러나 초기 "*"는 작동하지 않습니다.

답변1

파일 이름을 올바르게 인용했는지 확인하면 문제가 발생하지 않습니다.

for name in ./*; do
    newname=${name//[?\"*:]/ }
    if [ "$newname" != "$name" ]; then
        mv -iv "$name" "$newname"
    fi
done

"'"$file"'"실제로 는 $file전혀 인용하지 않습니다(작은따옴표로 묶지만 변수나 그 값은 인용되기 때문에 인용하지 않습니다).

또한보십시오:


당신에 대해 조금 sed.

sed많은 사람들이 간과하고 있는 깔끔한 작은 명령이 있습니다 y.

sed 'y/?"*:/    /'

이렇게 하면 표현식의 첫 번째 부분에 있는 모든 문자가 두 번째 부분(여기서는 모두 공백)의 해당 문자로 변경됩니다.

tr또한 유효합니다:

tr '?"*:' '    '

bash하지만 이 경우 내장된 매개변수 대체 도구를 사용하여 필요한 변경을 수행하는 것이 더 편리합니다.

답변2

귀하의 견적에 이상한 일이 일어나고 있습니다.

먼저 "'"변경"

관련 정보