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

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

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

При прохождении цикла я хотел бы получить имя файла thing.js

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

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

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

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

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

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

  • Переименуйте последние 8 символов в имени файла
  • Как вы переносите части имени файла в Linux?
  • Переименовать имена файлов, извлекая их из них
  • Переименование файлов на основе содержимого JSON
  • Как переименовать файл в ... (точка точка)?
  • Скопировать файлы с переименованием
  • Создание каталогов в цикле и перемещение файлов в эти каталоги
  • пакетное переименование имен файлов, включая пробелы и шаблоны
  • 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 - лучшая ОС в мире.