Выделение идеи Джеффа , но без использования списка:
for fname in *.*; do
prefix=${fname%.*}
[ ! -f "$fname" ] || [ -f "$prefix.zip" ] && continue
zip "$prefix" "$prefix".*
done
Этот цикл перебирает все имена в текущем каталоге, которые содержат хотя бы один символ точки.
Тело цикла извлекает префикс имени файла, удаляя бит после последней точки в текущем имени файла (используйте %%
вместо %
, чтобы удалить из первую точку ). Затем он проверяет, было ли имя на самом деле именем обычного файла (или символической ссылкой на один из них )и существует ли уже соответствующий Zip-архив для этого файла или нет.
Если файл является обычным файлом (или символической ссылкой на него ), и если архивный файл не существует, zip
вызывается для создания архива.
Я думаю, что модификатор I/i есть только у GNU sed.
Просто, если ваш sed не поддерживает I/i, вы можете использовать его, как показано ниже, чтобы избежать падеж смысл.
Назначьте переменную alias
, как показано ниже, и используйте sed
как:
$ alias="[Rr][Ee][Dd]1"
$ echo "RED1.NAME and red1.NAME and red1 and Red1" | sed -e "s/\($alias\).NAME/\1.COLUMN1/g"
RED1.COLUMN1 and red1.COLUMN1 and red1 and Red1
ИЛИ , если переменная alias
является динамической, вы можете использовать perl
или awk
, как показано ниже;
$ alias="red1"
$ act_cols="NAME"
$ third_ele="COLUMN1"
$ echo "RED1.NAME and red1.NAME and red1 and Red1" | perl -pe "s/($alias).$act_cols/\1.$third_ele/gi"
RED1.COLUMN1 and red1.COLUMN1 and red1 and Red1
Использование awk:
$ echo $alias
red1
$ echo "RED1.NAME and red1.NAME and red1 and Red1" | awk -v value=$alias 'BEGIN {IGNORECASE = 1} { gsub(value".NAME",value".COLUMN1");print }'
red1.COLUMN1 and red1.COLUMN1 and red1 and Red1