добавление специальных символов в имена папок

А как насчет

command argument --parameter=$(tr '\n' ',' < params.txt)
3
28.04.2016, 02:31
3 ответа
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
4
27.01.2020, 21:12

Если все начинается с 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 Расширение параметров оболочки , раздел:

 $ {параметр: смещение} 
 $ {параметр: смещение: длина} 
 
1
27.01.2020, 21:12

Подходящий ответ зависит от того, как имена могут отличаться. Вы можете преобразовать имена, используя встроенную подстановку параметров оболочки, если вы предполагаете постоянную ширину полей. Это относительно ограниченный объем.

Более интересным было бы использование классов символов в 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
2
27.01.2020, 21:12

Теги

Похожие вопросы