Я знаю, что таких вопросов много, но я не смог найти ни одного (или несколько из них), в котором описываются вещи, которые я хочу сделать. Я думаю, что мне нужно использовать регулярные выражения, но я не очень хорош в этом. Я использую Zsh. У меня есть папка с файлами, которую я хочу переименовать:

  • Я хочу, чтобы файлы challenge1.rb , challenge2.rb , challenge3.rb и т.д. Были переименованы в c1.rb , c2.rb и т.д. Аналогичным образом task1.rb и аналогичные должны быть переименованы в t1.rb и т.д.

  • sample_spec_c1.rb , sample_spec_c2.rb и т. д. должны быть переименованы в c1_spec.rb , c2_spec.rb и т. д.

Так что я думаю, что мне нужна некоторая комбинация регулярных выражений и итераций, но я не знаю, как написать скрипт bash.

1 ответ1

2

Вот короткий сценарий, который будет делать то, что вы хотите. Вы можете вызвать скрипт со списком файлов, таких как: ./scriptname *.rb или с каталогами (он будет их записывать ): ./scriptname .

Не забудьте установить исполняемый бит: chmod a+x scriptname .

#!/bin/sh

suff=rb     # suffix of files to rename

script="$0" # this script name for recursion

for f in "$@" ; do
    if test -d "$f" ; then
        echo "=== recursing directory $f"
        find "$f" -type f -name "*.$suff" -exec "$script" {} +
    elif test -f "$f" ; then
        d="$(dirname "$f")"
        b="$(basename "$f")"
        r="$(echo "$b" | sed -r "s/^([a-zA-Z])[a-zA-Z]*([0-9]+\.${suff})\$/\1\2/;s/^[a-zA-Z]+_([a-zA-Z]+)_([a-zA-Z]+[0-9]+)(\.${suff})\$/\2_\1\3/")"
        echo "-- renaming $f -> $d/$r"
        mv "$f" "$d/$r"
    fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .