Замена одного символа в имени файла другим

У меня есть файл с именем a_b-c-d-e-f.txt . Я хотел бы взять это текущее имя и поменять местами дефисы и подчеркивания, чтобы он стал a-b_c_d_e_f.txt .

Моя интуиция подсказывает мне попробовать переименовать или tr , но у меня проблемы с этим. Вот моя текущая попытка

#!/bin/bash
for i in *.txt; do
  [ -f "$i" ] || break
  newFile=$(echo "$i" | tr '-' '_')
  cp "$i" $newFile
done

Таким образом, я получаю

a_b_c_d_e_f.txt

Это та часть между a-b, которая не должна изменяться. Кроме того, тире не обязательно всегда находится в этом месте в имени файла. Например, это может выглядеть как

a-b-c_d-e-f.txt

Или любая подобная комбинация. Я хочу, чтобы они переворачивались независимо от их места в названии.

4
задан 19 November 2020 в 07:46

4 ответа

for v in *.txt
do
    newname=`echo $v | tr '_-' '-_'`
    mv $v $newname
done

Я обнаружил, что это работает. Это была комбинация моего сообщения и ответа Тони.

0
ответ дан 3 January 2021 в 22:48

Некоторые другие варианты:

  1. ваш цикл, но с редко используемым sed y команда транслитерации вместо tr пример

     printf -v newFile "% s" "$ (sed 'y / _- / -_ /' <<<" $ i ")"
     
  2. основанная на perl команда rename с использованием встроенного в perl tr (цикл оболочки не требуется)

     rename -n 'tr / _- / -_ /'  *[-_]*.текст
     

    (удалите -n , если вы уверены, что он поступает правильно).

6
ответ дан 3 January 2021 в 22:48
$ echo "a-b_c" | tr '_-' '-_'
a_b-c
7
ответ дан 3 January 2021 в 22:48

Другие вопросы по тегам:

Похожие вопросы: