Переименование файлов в префикс и средняя часть имени файла

У меня есть сценарий, который в какой-то момент делает следующее:

for src in $(find -H "$ROOT_DIR" -maxdepth 5 -name '*.test' -not -path '*.git*') do fixed_filename=$(echo "$(basename "${src%.*}")" | sed 's/-test//') 

В принципе, у меня есть файлы под названием thing-test.js.test

  • Создание * красиво * отформатированного списка количества файлов в каталогах - awk & sed возможно
  • Список всех файлов с одинаковым именем и количеством файлов
  • Почему программа unix mv не нужна опция -R (рекурсивная) для каталогов, но cp действительно нуждается?
  • Удалить дату и время рекурсивно из имен файлов
  • Добавить символ подчеркивания символов для всех каталогов в каталоге
  • POSIX-совместимый способ работы со списком имен файлов, возможно, с пробелами
  • При прохождении цикла я хотел бы получить имя файла thing.js

    В конце концов, я создам полный путь к файлу с помощью path="$ROOT_DIR"/"$fixed_filename"

    Вышеприведенное, похоже, работает, но это определенно неверно: я – жадный пользователь shellcheck, и он говорит мне, что есть бесполезное эхо (я согласен) и пытаюсь использовать ${variable//search/replace} если это возможно.

    Поблагодарили бы за помощь в очистке выше.

    Редактировать:

    Основная суть того, что я пытаюсь сделать, это:

    Я пытаюсь рекурсивно искать каждый файл в каталоге, следуя определенному шаблону имени файла, например file-test.js.test и внутри этих файлов являются переменными-заполнителями, например REPLACEME Я хочу найти все эти файлы и один за другим, один заменит REPLACEME на строку, предоставленную пользователем, из вызова чтения внутри скрипта bash, и пока я там, я хотел бы изменить имя файла на file.js например remove -test и .test

  • В частности, удалите файлы, начинающиеся с ._, используя терминал
  • Для каждой подпапки сортируйте файлы по имени и переименовывайте их в последовательные заполненные номера (независимо от расширения)
  • Шифрование или кодирование имени файла по данным с gpg
  • Измените конец нескольких похожих имен файлов
  • Есть ли какая-либо разница w / v / sw / o "./" в относительном пути?
  • такое же имя файла в нескольких каталогах: как назначить их с разными именами одновременно с помощью только одной команды?
  • 2 Solutions collect form web for “Переименование файлов в префикс и средняя часть имени файла”

    Чтобы переименовать, например, stuff-X.js.test в stuff.js (не зная расширения до .test ), вам нужно будет использовать несколько выражений для извлечения необходимых частей, например, разделить путь на голову h=${path%/*} и tail t=${path##*/} затем получите строку перед тире с ${t%%-*} а для строки в середине получите имя без расширения, например noext=${t%.*} затем из этого экстракта, что теперь является новым расширением с ext=${noext##*.} так что:

     find . -name '*-*.test' -exec sh -c 'h=${1%/*}; t=${1##*/}; noext=${t%.*};\ ext=${noext##*.}; fixed=${h}/${t%%-*}.${ext}; echo mv "$1" "$fixed"' sh {} \; 

    Используйте команду find сочетании с оболочкой с использованием флага -exec :

     $ find -name "*.test" -exec sh -c 'echo "$(basename -s ".test" "$1")".js' sh {} \; one.js three.js two.js 

    Обратите внимание, что basename -s ".test" "$1" удаляет суффикс, поэтому вам не нужно вызывать sed в первую очередь.

    Если в конце концов вам нужно сделать что-то еще с этим «фиксированным именем файла», замените это эхо с присвоением переменной и продолжайте работать в той же команде sh . Что-то вроде этого:

     $ find -name "*.test" -exec sh -c 'fixed_name=$(basename -s ".test" "$1").js; my_other_command "$fixed_name"' sh {} \; 
    Linux и Unix - лучшая ОС в мире.