首页 > 解决方案 > 如何为所有部分文件名匹配创建符号链接?

问题描述

我正在尝试为文件名列表中的所有文件创建符号链接,其中列表中的文件名仅部分匹配文件名。

我有一个部分文件名列表 (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"* ]] && ln -s <path to files>/*"$file"* .
 done < file_name_list.txt ```

标签: bash

解决方案


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

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

使用模式列表过滤所有文件名grep -f并创建链接。上面的所有命令都使用空分隔参数来保留文件名。

通常,使用相对路径创建链接更有用,因为如果您移动两个位置的父目录或挂载它,它们仍然可以使用。为了简化这一点,请使用-r参数 with 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\0" | grep -zf "$f" |
    xargs -r0 -I{} ln -rs "$files_dir/{}" "$links_dir/{}"

ls目录的结果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

推荐阅读