Я использовал бы следующее:
#! /bin/bash
cd DirectoryName
for file in *.csv; do
filename=${file%.*}
file_clean=`echo $filename | tr -cs "[:alnum:]_" _ `
final="$file_clean.csv"
echo "mv \"$file\" \"$final\" "
done
cd ..
Единственные изменения:
1) Было пространство после = в строке final= "$file_clean.csv"
. Я удалил его.
2) Вместо того, чтобы использовать строковую замену управляют, чтобы я использовал tr
команда. С TR, -c
опция говорит для замены любого символа, который не находится в наборе. Таким образом, я могу указать символы, я хочу сохранить (буквенно-цифровой индикатор и подчеркивание, в этом случае) и все, что другие будут преобразованы.
Это должно соответствовать некоторым более специальным символам, которые трудно указать через прямую замену, такой как []\{}
и "
. -s
опция означает, что только одно подчеркивание будет сгенерировано даже если подавление нескольких символов. Таким образом abc((((())))).csv
переводит в abc_.csv
вместо abc__________.csv