我正在提取 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'
。
答案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/$^array
whenarray=(a b c)
扩展为x/a
x/b
x/c
而不是x/a
b
c
forx/$array
。(N.)
: glob 限定符:N
用于N
ullglob,用于在没有匹配项时将 glob 扩展为空。.
将全局扩展限制为常规的文件,排除任何其他类型的文件(fifo、目录、符号链接...)。