1

Это то, что я до сих пор.

#!/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 ответ1

2

Я бы использовал следующее:

#! /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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .