Как написать скрипт, создающий символические ссылки файлов, находящихся внутри папок исходного каталога, на другой каталог

$ sed -e '
   h
   s/\..*//;y/linux/LINUX/;/LINUX/!d
   g
' inp.file

Это подход Posix sed, который вы можете использовать.

1
14.10.2021, 15:37
1 ответ
#!/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таким же образом, чтобы вместо этого оболочка завершала работу с диагностическим сообщением, если ни одно имя не соответствует шаблону.

0
14.10.2021, 21:35

Теги

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