как создать символические ссылки для всех частичных совпадений имен файлов?

#bash

#bash

Вопрос:

Я пытаюсь создать символические ссылки на все файлы в списке имен файлов, где имена файлов в списке только частично совпадают с именами файлов.

У меня есть список частичных имен файлов (file_name_list.txt )

 cat file_name_list.txt
>file_ABC
>file_DEF
>file_GHI
  

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

 ls -l <path to original files>
>new_file_ABC.txt
>file_ABC.fasta
>OCTOBER_file_DEF.fa
>file_DEF.gff
>file_GHI.txt
>file_XYZ.txt
  

где предполагаемый результат будет :

 ls -l <path to symlinked files>
new_file_ABC.txt
file_ABC.fasta
OCTOBER_file_DEF.fa
file_DEF.gff
file_GHI.txt
  

что я пробовал:

 while IFS= read -r file; do
    [[ -e <path to files>/*"$file"* ]] amp;amp; ln -s <path to files>/*"$file"* .
 done < file_name_list.txt ```
  

Комментарии:

1. what I've tried: разве это не сработало?

2. это ничего не дает

Ответ №1:

 files_dir="1"
links_dir="2"
f="filenames_list.txt"

find "$files_dir" -type f -printf "%f" | grep -zf "$f" |
    xargs -r0 -I{} ln -rs "$files_dir/{}" "$links_dir/{}"
  

Отфильтруйте все имена файлов через a grep -f с помощью списка шаблонов и создайте ссылки. Все приведенные выше команды используют аргументы, разделенные нулем, для сохранения имен файлов.

В общем, более полезно создавать ссылки с относительным путем, поскольку они будут по-прежнему функционировать, если вы переместите родительский каталог из обоих местоположений или смонтируете его. Чтобы упростить это, используйте -r параметр с ln , предоставляя аргументы такими, какие они есть.


пример

filenames_list.txt :

 file_ABC
file_DEF
file_GHI
  
 mkdir -p 1
mkdir -p 2
touch 1/new_file_ABC.txt
touch 1/file_ABC.fasta
touch 1/OCTOBER_file_DEF.fa
touch 1/file_DEF.gff
touch 1/file_GHI.txt
touch 1/file_XYZ.txt
touch 1/file1.txt
touch 1/file2.txt

files_dir="1"
links_dir="2"
f="filenames_list.txt"

find "$files_dir" -type f -printf "%f" | grep -zf "$f" |
    xargs -r0 -I{} ln -rs "$files_dir/{}" "$links_dir/{}"
  

результат ls для dir 2/

 file_ABC.fasta -> ../1/file_ABC.fasta
file_DEF.gff -> ../1/file_DEF.gff
file_GHI.txt -> ../1/file_GHI.txt
new_file_ABC.txt -> ../1/new_file_ABC.txt
OCTOBER_file_DEF.fa -> ../1/OCTOBER_file_DEF.fa