这是我目前所拥有的。
#!/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
答案1
我将使用以下内容:
#! /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