Это то, что я до сих пор.
#!/bin/bash
pushd DirectoryName
for file in *.csv; do
#echo $file
filename=${file%.*}
file_clean=${filename//[ ()$+&\.\-\'\,]/_}
final= "$file_clean.csv"
mv "$file" $final
done
popd
Я бы использовал следующее:
#! /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
Csv переводится в abc_.csv
вместо abc__________.csv