创建从文件读取的目录的符号链接 Glob

创建从文件读取的目录的符号链接 Glob

我正在提取 tsv 文件第五列的目录名称ExtensionList.tsv,并且我想创建指向所有这些文件夹的符号链接,这些文件夹的名称以位于扩展文件夹内的 ${HOME} 开头

awk -F'\t' '{print $5 }' ExtensionList.tsv \
    | xargs -L 1 -I "{}" ln -s -f "${HOME}/{}"* Extension

示例 Tsv 文件

2   n   xshrim.txt-syntax   Txt Syntax  xshrim.txt-syntax

我想做(对于 tsv 文件中的所有记录)

ln -s -f xshrim.txt-syntax* Extension

有什么建议么?

为什么我的命令不起作用?

答案1

必须对从 TSV 文件读取的每个名称分别进行全局扩展。这可以通过对每个目录名称调用一次sh -c来完成。xargs

cut -f 5 ExtensionList.tsv | 
  xargs -I {} sh -c 'ln -s -f "$HOME/$1"* Extension/' sh {}

请注意,它假定第五列中的文件名不以空格开头,也不包含反斜杠、单引号或双引号字符。通过 GNU 实现xargs,添加-d '\n'可以解决这些问题。

为了避免sh每个文件运行一个:

cut -f 5 ExtensionList.tsv | 
  xargs sh -c '
    ret=0
    for dirpath do
      ln -s -f "$HOME/$dirpath"* Extension/ || ret=$?
    done
    exit "$ret"' sh

除了上述限制之外,文件路径也不得在任何地方包含空格。 GNU xargs' 也避免了这种额外的限制-d '\n'


参考:有没有办法使用通配符创建符号链接 - Thinbug

答案2

zsh

typeset -U prefixes=( ${(f)"$(cut -f5 < ExtensionList.tsv)"} )
typeset -U regular_files_with_those_prefixes=( ~/$^prefixes*(N.) )
if (( $#regular_files_with_those_prefixes )); then
  ln -sf -- $regular_files_with_those_prefixes Extensions
fi

在哪里:

  • typeset -U:确保数组元素是唯一的(已删除重复项)
  • ${(f)"$(cmd)"}cmd:分割在线需求的输出f
  • x/$^arraywhenarray=(a b c)扩展为x/a x/b x/c而不是x/a b cfor x/$array
  • (N.): glob 限定符:N用于Nullglob,用于在没有匹配项时将 glob 扩展为空。.将全局扩展限制为常规的文件,排除任何其他类型的文件(fifo、目录、符号链接...)。

相关内容