使用不带 ./ 的查找结果

使用不带 ./ 的查找结果

我正在尝试使用 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/{}'

man find

  • -print0在标准输出上打印完整的文件名,后跟一个null 字符。

man cut- 从文件的每一行中删除部分

  • -z行分隔符是NUL,而不是换行符。
  • -c仅选择这些字符。
  • N-从第 N 个字节、字符或字段(从 1 开始计数)到行尾。

man xargs- 从标准输入构建和执行命令行。

  • xargs [options] [command [initial-arguments]]
  • -0输入项以字符而不是空格结尾null,并且引号和反斜杠并不特殊(每个字符均按字面意思理解)。
  • -I replace-strreplace-str将中 出现的 替换为initial-arguments从标准输入读取的名称。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。暗示-L 1
  • -L max-linesmax-lines每个命令行 最多使用非空白输入行。

相关内容