У меня есть файл с именем 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
Или любая подобная комбинация. Я хочу, чтобы они переворачивались независимо от их места в названии.
for v in *.txt
do
newname=`echo $v | tr '_-' '-_'`
mv $v $newname
done
Я обнаружил, что это работает. Это была комбинация моего сообщения и ответа Тони.
С помощью переименовать
( manual ) просто
rename 'y/_-/-_/' *.txt
Здесь больше информации о y /
и соответствующем сообщении о переименовать
Некоторые другие варианты:
ваш цикл, но с редко используемым sed y
команда транслитерации вместо tr
пример
printf -v newFile "% s" "$ (sed 'y / _- / -_ /' <<<" $ i ")"
основанная на perl команда rename
с использованием встроенного в perl tr
(цикл оболочки не требуется)
rename -n 'tr / _- / -_ /' *[-_]*.текст
(удалите -n
, если вы уверены, что он поступает правильно).