我想要的是

我想要的是

我想要的是

简化的命令:echo "helloworld" | echo $1

  • 我知道,这可以使用cat,但是如果像这样的命令echo不将文件作为输入怎么办?

我的实际命令:ls -li init.vim | cut -d " " -f 1 | find / -inum $1

  • 我知道它不能$1像那样工作,这只是一个示例,并且$1只是一个占位符。

命令替换:find / -inum $(ls -li init.vim | cut -d " " -f 1)

  • 这工作正常,但我不希望它与命令替换

问题

  1. 这可以在没有任何东西的情况下工作吗解决方法或者命令替换
  2. 如果没有的话,最好的方法是什么?


感谢您的帮助 :)

答案1

在这里,通过多种find实现,您可以这样做:

find / -samefile init.vim

这也更正确,因为索引节点号对于每个文件系统来说都是唯一的,因此除了索引节点号之外,您还需要检查设备号。

在这里,命令的整个输出减去尾随换行符,它将作为一个参数传递给命令,命令替换是要走的路,尽管在这种情况下不加引号是没有意义的:

find / -inum "$(ls -id init.vim | awk '{print $1; exit}')"

不需要-l,但如果是目录类型,我们需要-d避免出现问题。init.vim另请参阅,;exit因此我们只打印第一个字段第一行的处理文件名包含换行符的情况。

或者更好的是,首先检查您是否能够获取索引节点号

#! /bin/sh -
file=init.vim
inode=$(
  set -o pipefail # also care about ls exit status below
  ls -id -- "$file" | awk '{print $1; exit}'
) || exit
find / -inode "$inode"

(在这里,最好将其不加引号,因为我们不在列表上下文中,因为这是标量变量赋值,因此不会发生 split+glob)。

将输入流转换为参数列表的通用命令是命令xargs(交叉参数):

ls -id init.vim | awk '{print $1; exit}' |
  xargs -I @INODE@ find / -inum @INODE@

值得注意的是,xargs它将分割输入(以它自己的方式,它确实理解某种形式的引用)来组成参数(并且使用-I,分割的完成方式与不使用不同),请参阅系统上的手册页细节和POSIX 规范满足您所期待的便携性。在这种情况下,12345<newline>的输出awk将被拆分为一个12345参数。

相关内容