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
귀하의 견적에 이상한 일이 일어나고 있습니다.
먼저 "'"
변경"