А как насчет
command argument --parameter=$(tr '\n' ',' < params.txt)
IFS="\n" # Handle files with spaces in the names
for file in ABS*; do
newfile="${file/ABS/ABS-}" # Add the hyphen following ABS
newfile="${newfile/_/-}" # Change the underscore to a hyphen
mv "$file" "$newfile" # Make the change
done
В свете комментариев Тони ниже, более общая версия использования могла бы быть следующей:
IFS="\n" # Handle files with spaces in the names
for file in ABS*; do
newfile="${file/foo/bar}" # Replace foo with bar
newfile="${newfile/baz/quux}" # Replace baz with quux (repeat as needed)
if [[ "$file" == "$newfile" ]]; then
echo "Not renaming $file - no change decreed."
elif [[ -f "$newfile" ]]; then
echo "Not renaming $file - $newfile already exists."
else
mv -- "$file" "$newfile" # Make the change
fi
done
Если все начинается с ABS1789_2563-
for f in ABS*; do mv "$f" ABS-1789-2563-${f:13}; done
Здесь
ABS-1789-2563-
это просто жестко запрограммировано в предположении, что все ваши папки начинаются с ABS1789_2563- .
${f:13}
расширяется до конца параметра $ f
, начиная со смещения 13 - часто называемого подстрокой . В bash Расширение подстроки .
См. 3.5.3 Расширение параметров оболочки , раздел:
$ {параметр: смещение} $ {параметр: смещение: длина}
Подходящий ответ зависит от того, как имена могут отличаться. Вы можете преобразовать имена, используя встроенную подстановку параметров оболочки, если вы предполагаете постоянную ширину полей. Это относительно ограниченный объем.
Более интересным было бы использование классов символов в sed
:
newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/\1-\2-/')
то есть после начального буквенного префикса добавить тире, а затем после цифр, заканчивающихся подчеркиванием, изменить , что до тире.
В отличие от возможных решений, использующих подстановку параметров, этот подход допускает любую (ненулевую) длину из буквенного префикса и цифр. Таким образом, вы можете использовать это в качестве входных данных:
ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02
ABSOLUTE1789_2563-01
ABSURD1789_2563-02
ABSOLVE1789_2563-02
PREFIX1793939389_2563-02
поместите это в сценарий
#!/bin/sh
for oldname in `cat foo4.txt`
do
newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/\1-\2-/')
echo "$oldname ->$newname"
done
, дающий этот вывод (в подходящем цикле):
ABS1789_2563-01 ->ABS-1789-2563-01
ABS1789_2563-02 ->ABS-1789-2563-02
ABS1789_2563-02 ->ABS-1789-2563-02
ABSOLUTE1789_2563-01 ->ABSOLUTE-1789-2563-01
ABSURD1789_2563-02 ->ABSURD-1789-2563-02
ABSOLVE1789_2563-02 ->ABSOLVE-1789-2563-02
PREFIX1793939389_2563-02 ->PREFIX-1793939389-2563-02