Уродливый и хрупкий, но он должен выполнить свою работу:
find /data/DIV5/SASC/e042_ctcl/input/*/Clean_data/*/*/*.fq.gz -type f -print0 | \
xargs -0 -n 1 \
sh -c 'mkdir -p "$PWD/`dirname $0`"; ln -s "$0" "$PWD/`dirname $0`"'
Вдохновленный ответом хаоса , я придумал эту альтернативу, которая также убирает ненужные директории :
find /data/DIV5/SASC/e042_ctcl/input/*/Clean_data/*/*/*.fq.gz -type f \
-printf 'mkdir -p "${PWD}/%h"; ln -s "%p" \\\n\t"${PWD}/%h"\n' | \
sed 's#/data/DIV5/SASC/e042_ctcl##' | \
sh -
Она генерирует требуемые mkdir и ln команды:
mkdir -p "${PWD}//data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a"; ln -s "/data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a/foobar.fq.gz" \
"${PWD}//data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a"
Затем он удаляет из них ненужные каталоги с помощью sed, в результате чего:
mkdir -p "${PWD}//input/x/Clean_data/0/a"; ln -s "/data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a/foobar.fq.gz" \
"${PWD}//input/x/Clean_data/0/a"
Команда ln начинается в той же строке, что и mkdir, и продолжается в следующей строке, чтобы сохранить источник в целости и сохранности во время обрезки пункта назначения. Для их печати на той же строке или на каждой отдельной строке потребовался бы более сложный сценарий sed.
Пояснение из -документации для find, из -printf
параметров:
%p
. Имя файла (не абсолютное имя пути, а имя файла в том виде, в котором он был найден - т.е. как относительный путь от одной из начальных точек)
%h
. Ведущие каталоги имени файла (все, кроме последнего элемента и косой черты перед ним). Если имя файла не содержит косой черты (например, потому что он был назван в командной строке и находится в текущей рабочей директории), то "%h" расширяется до "...". Это предотвращает расширение "%h/%f" до "/foo", что было бы удивительно и, вероятно, нежелательно.
Номер версии программы не является хорошим показателем проблем безопасности, которые у нее есть. Когда обнаруживается дыра в безопасности, стандартной практикой является исправление именно этой дыры, а не обновление программы до более поздней версии, которая в тонких случаях может оказаться несовместимой.
Таким образом, видя, что у вас есть bash 4.1, вы не получаете никакой информации о том, уязвима ли она для Shellshock. Используйте тест, подобный тому, который вы уже нашли. Так как x='() { :;}; echo vulnerable' bash -c 'echo hello'
не печатает vulnerable
, вы не уязвимы к ошибке Shellshock. Тот факт, что вы не видите сообщения об ошибке, также указывает на то, что ваша копия bash также имеет патчи для исправления ошибок, связанных с , найденных в результате работы Shellshock. Статья, в которой упоминаются эти сообщения об ошибках, устарела: с последними исправлениями эта команда просто печатает hello
.