USBボリュームにファイルを書き込むために、「?」、「」、「*」、または「:」を含むファイルの名前を変更し、これらの文字を空白に変更したいのですが、「*」を使用しています。
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/?"*:/ /'
これにより、式の最初の部分のすべての文字が2番目の部分(ここではすべて空白)の対応する文字に変更されます。
tr
また利用できます:
tr '?"*:' ' '
bash
ただし、この場合は、組み込みのパラメータ置換ツールを使用して必要な変更を行う方が便利です。
答え2
あなたの見積もりに奇妙なことが起こっています。
まず"'"
変更"