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"* ]] && ln -s <path to files>/*"$file"* .
done < file_name_list.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/{}"
使用模式列表过滤所有文件名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
推荐阅读
- python - 在numpy数组中生成多个具有固定总和= 100的随机整数
- ios - 为什么我们需要在 iOS 中使用单独的单例类来处理 AppDelegate 单例中的全局变量?
- c++ - 位域和值初始化的缓冲区溢出 - 编译器错误或未定义的行为?
- html - 如何在新的 Flutter Web 中添加自定义 html 平台视图
- java - 我们如何将字符串与 Java 中的枚举元素的值进行比较
- python - Python 正则表达式修改 re.sub() 中的组匹配
- azure - 如何使用来自邮递员的多个参数触发 Azure 数据工厂管道
- php - 来自其他服务器图像的 PHPmailer AddEmbeddedImage
- convertigo - ResetDatabase Fullsync 事务不同步本地客户端数据库
- excel - 如何仅显示用户窗体并完全隐藏 excel 窗口?