создание символической ссылки на основе соответствующего имени файла

Здесь нет особой необходимости в bash; простой скрипт shможет сделать это, дважды используя позиционный массив. Внешний цикл выбирает все нужные файлы данных (подстановочные знаки для частей идентификатора и даты ); он извлекает часть идентификатора, а затем запускает подоболочку для перебора всех файлов с этим идентификатором. Затем эта подоболочка перебирает естественно отсортированный по дате -список этих файлов и удаляет все, кроме последнего, сохраняя самый новый.

#!/bin/sh

set -- *_data_*.csv
for f in "$@"
do
  id=${f%%_*}
  # a subshell so we don't clobber $@
  (
        set -- "${id}"_data_*.csv
        while [ "$#" -gt 1 ]
        do
          rm -- "$1"
          echo "DELETE: $1"
          shift
        done
  )
done

Я добавил оператор echo... DELETE, чтобы продемонстрировать результаты для указанных вами имен файлов:

DELETE: 10020209_data_2019-04-23_001.csv
DELETE: 10020209_data_2019-04-24_001.csv
DELETE: 10020209_data_2019-04-25_001.csv
DELETE: 10020209_data_2019-04-26_001.csv
DELETE: 10020209_data_2019-04-27_001.csv
DELETE: 10020272_data_2019-04-23_001.csv
DELETE: 10020272_data_2019-04-24_001.csv
DELETE: 10020272_data_2019-04-25_001.csv
DELETE: 10020272_data_2019-04-26_001.csv
DELETE: 10020272_data_2019-04-27_001.csv
-1
20.04.2021, 23:59
2 ответа

Поскольку у вас уже есть два столбца, пробовали ли вы использовать awk?

echo 'SAMEA3471108.fixed.GRCh37d5.cram  PD26400a.fixedheader.hs37d5.cram' | awk '{print $1, "->", $2}'
SAMEA3471108.fixed.GRCh37d5.cram -> PD26400a.fixedheader.hs37d5.cram

Вы могли бы использовать что-то вроде этого, может быть:

awk '{ system("ln $1 $2") }
0
28.04.2021, 22:51
$ < <(awk 'NF==2 {print "ln -s -T "$1 " " $2}' filein) xargs -0 bash -c  

, где filein— текстовый файл, содержащий два столбца.

Редактировать :добавлен флаг -sк вызову lncmd, предполагая, что вам нужны символические ссылки вместо жестких ссылок по умолчанию.

0
28.04.2021, 22:51

Теги

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