Вот способ сделать это с помощью СЭД:
#!/bin/bash
find -type f -print0 | \
while IFS= read -r -d '' old_path; do
new_path="$(echo "$old_path" | sed -e 's|/\([^/]\+\)/\([^/]\+\) - \1.\([^/.]\+\)$|/\1/\2.\3|')"
if [[ $new_path != $old_path ]]; then
echo mv -- "$old_path" "$new_path"
# ^^^^ remove this "echo" to actually rename the files
fi
done
Вы должны cd
в каталоге верхнего уровня, который содержит все эти файлы, чтобы сделать это. Кроме того, он содержит echo
, поэтому он фактически не переименовывает файлы. Запустите его, чтобы посмотреть, нравится ли вам его вывод, и если вы это сделаете, удалите echo
и запустите его снова.
Основная идея состоит в том, что мы перебираем все файлы и для каждого файла, мы пытаемся найти, соответствует ли файл заданному шаблону. Если это произойдет, мы переименуем его. Шаблон обнаруживает (и захватывает) второй последний компонент пути, а также разбивает последний компонент пути на 3 части: префикс, суффикс (который должен совпадать с предыдущим компонентом пути) и расширение.
Действительно ли путь к файлу 'one/berg - one.txt', или это' one/berg - one.txt'? – redneb
[изменить] ваш вопрос и используйте кнопку '{}', чтобы сделать ваш пример разборчивым. –
Sí ./uno/filename - uno.txt - И я хочу удалить имя каталога в имени файла. –