Гаряче, щоб видалити спеціальні символи з імен файлів і перейменувати їх у каталозі?


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

Відповіді:


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 опція говорить про заміну будь-якого символу ні у наборі. Тому я можу вказати символи, які я хочу зберегти (алфавітно-цифрова і підкреслена, в даному випадку), і всі інші будуть перетворені.

Це має збігатися з деякими спеціальними символами, які важко визначити за допомогою прямого заміщення, наприклад []\{} і ". The -s означає, що буде створено лише одну підкреслення, навіть якщо придушення декількох символів. Таким чином abc((((())))).csv перекладається в abc_.csv замість abc__________.csv


1
Ви можете зробити те ж саме, що і 2) без використання зовнішнього виконуваного файлу tr: file_clean=${filename//[^[:alnum:]]/_}. Можна припинити виконання декількох символів, наприклад: shopt -s extglob; file_clean=${filename//+([^[:alnum:]])/_}
Dennis Williamson

Cool. Я не знав, що можна використовувати класи символів у підстановках bash. Дякую.
Pat Wallace

Я поставив -n прапор на команду mv. Якщо у вас є два назви файлів, які прибирають одне і те ж ім'я, ви перезапишете & amp; вільний.
gorilla
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.