在“find”输出结果中引用路径名

在“find”输出结果中引用路径名

我想做的是能够将find路径名结果作为参数引用到另一个命令,而无需费力地键入完整路径名。例子:

$ find -name testfile  
path1  
path2  
path3  
$ cd path2

怎么有人能做到这一点?

答案1

在 bash 中,如果变量具有文件的完整路径值(即 /home/spider/src/myscript.py),则可以使用变量操作来获取基本名称和目录名称。

因此,例如:

filepath='/home/spider/src/myscript.py'

filename=${filepath##*/}
echo $filename
myscript.py

path=${filepath%/*}
echo $path
/home/spider/src

Bash内置读取命令,支持从stdin读取到数组,使用-a选项,所以你可以使用这个:

IFS='$\n' read -d '' -a files < <(find . -name testfile -type f)

shell 数组变量现在包含所有文件及其路径。使用以前的 shell 字符串操作结构,您现在可以执行以下操作

cd ${files[2]%/*}

更改为第二个文件的路径。

关于上面命令的一些注意事项:

  • 选项 -d '' (注意 -d 和 '' 之间的空格)选择空字符作为读取的分隔符。
  • 选项 -a,如上所示,将标准输入读入索引数组(在本例中名为“文件”)
  • < <(command) 将 <( 和 ) 之间的命令输出重定向到标准输入。这对于阅读来说很方便,但你无法通过管道进行读取。
  • 我已在 find 命令中添加了“-type f”,以确保您只获得文件
  • 以供参考bash 中的字符串操作数
  • 您可以使用 basename(1) 和 dirname(1) 命令来达到相同的目的,但它们会生成一个新进程,因此效率稍低。

答案2

您可以运行其他命令作为语句的一部分find吗?

find -name testfile -exec othercommand {} \;

{}是找到的路径。参数必须-exec以分号 终止,;但您需要在 bash 中使用反斜杠 转义它\

此示例将更改每个找到的文件的权限:

find -name testfile -exec chmod 755 {} \;

相关内容