Bash ファイル名拡張子の制限

Bash ファイル名拡張子の制限

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ただし、この場合は、組み込みのパラメータ置換ツールを使用して必要な変更を行う方が便利です。

おすすめ記事