我正在尝试使用 find 创建一堆符号链接,但使用带有 {} 的结果在每个文件名之前包含 ./ 。我怎样才能避免这种情况?
find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
答案1
您只需更改命令中的一个字符:
find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
# ^
答案2
使用标准语法,例如:
S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
for i do
ln -s -- "$S${i#.}" "$D/$i"
done' sh {} +
如果你想使用 GNUisms,你可以这样做:
find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
xargs -r0n2 ln -s
或者如果/sourcedir
是当前目录:
find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
xargs -r0n2 ln -s
答案3
find
将打印相对于您作为参数提供的路径的名称。在本例中,路径为.
,因此所有名称都以 开头./
。要获取绝对路径,您需要提供绝对路径作为输入:
find "$PWD" -type l -name '*.h'
该命令使用$PWD
环境变量,其中包含当前工作目录的绝对路径,因此它应该保留原始命令的含义。
答案4
find . -type l -name '*.h' -print0 | cut -z -c3- \
| xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'
-print0
在标准输出上打印完整的文件名,后跟一个null
字符。
man cut
- 从文件的每一行中删除部分
-z
行分隔符是NUL
,而不是换行符。-c
仅选择这些字符。N-
从第 N 个字节、字符或字段(从 1 开始计数)到行尾。
man xargs
- 从标准输入构建和执行命令行。
xargs [options] [command [initial-arguments]]
-0
输入项以字符而不是空格结尾null
,并且引号和反斜杠并不特殊(每个字符均按字面意思理解)。-I replace-str
replace-str
将中 出现的 替换为initial-arguments
从标准输入读取的名称。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。暗示-L 1
。-L max-lines
max-lines
每个命令行 最多使用非空白输入行。