我想做的是能够将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 {} \;