Intereting Posts
Как установить kali Linux на внешний жесткий диск? Chrubuntu на Acer C7: SD-кард-ридер работает только от сети переменного тока? Как обеспечить правильные разрешения для файлов при запуске установщика bash как sudo? Добавление fcontext в неограниченное приложение sed удаляет все до и включая первый период, если в этой строке более одного периода, и делайте это для всего файла GNU parallel – два параметра из массива в качестве параметра Простой сценарий оболочки с арифметической проблемой … ** дает мне проблемы Как преобразовать 32-разрядную (x86) систему на базе Debian в 64-разрядную BBB: `bbb-conf –check` показывает IP-адреса как` inet` – ifconfig woes / mnt Каталоги исчезают sed не будет расширять мою переменную BASH в скрипте Какой процесс отправил данные с моего компьютера? Что такое область применения Kali Linux? Скажите сотату прослушивать соединения с одного IP-адреса Странное поведение

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

У меня очень длинный список папок со следующим соглашением об именах

ABS1789_2563-01 ABS1789_2563-02 ABS1789_2563-02 . . . 

Как я могу добавить «-» между ABS и 1789, а затем заменить «_» на «-» между 1789 и 2563 с помощью bash?

 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 

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

Более интересным будет использование классов символов в 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 

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

 ${parameter:offset} ${parameter:offset:length}