$ sed -e '
h
s/\..*//;y/linux/LINUX/;/LINUX/!d
g
' inp.file
Это подход Posix sed, который вы можете использовать.
#!/bin/bash
shopt -s nullglob
srcdir=Example/Release
destdir=/tmp
mkdir -p "$destdir" || exit
for pathname in "$srcdir"/*/version*.zip; do
name=${pathname#"$srcdir"/} # "Version 1/version1.zip"
name=${name%/*}-${name#*/} # "Version 1-version1.zip"
ln -s "$PWD/$pathname" "$destdir/$name"
done
Приведенный выше скрипт предполагает структуру каталогов Example/Release
, которую вы указали в вопросе, и что файлы в подкаталогах соответствуют version*.zip
. Цикл перебирает все эти version*.zip
файлы и строит имя ссылки, используя имя файла и имя ближайшего родительского каталога. Он создает символическую ссылку в каталоге $destdir
как символическую ссылку на абсолютный путь.
Здесь используются два типа подстановки параметров:
${variable#pattern}
, заменяется на $variable
с удалением самой короткой строки префикса, соответствующей pattern
. ${variable%pattern}
, как и выше, но вместо строки префикса удаляется строка суффикса. $PWD
значение, поддерживаемое оболочкой (абсолютный путь к текущему рабочему каталогу ).
Я устанавливаю параметр оболочки nullglob
для сценария, чтобы цикл не запускался один раз, если шаблон не соответствует (в этом случае шаблон обычно остается нераскрытым ). В качестве альтернативы вы можете установить параметр оболочки failglob
таким же образом, чтобы вместо этого оболочка завершала работу с диагностическим сообщением, если ни одно имя не соответствует шаблону.