Shell脚本:标识模式中的所有路径
我试图找到一个模式中的所有路径,但我被卡住了。这是目录的结构Shell脚本:标识模式中的所有路径,shell,sh,Shell,Sh,我试图找到一个模式中的所有路径,但我被卡住了。这是目录的结构 testdir |-- dir with spaces | |-- subdir | | | | | |-subfile.sh | | | +-- 1.sh | | | +-- 2.sh | +-- dir1 | | | | | +-- file.sh | +-- test.sh 这是我拥有的路径模式testdir/*** 我想要什么 我想要得到的结
testdir
|-- dir with spaces
| |-- subdir
| | |
| | |-subfile.sh
| |
| +-- 1.sh
| |
| +-- 2.sh
|
+-- dir1
| |
| |
| +-- file.sh
|
+-- test.sh
这是我拥有的路径模式testdir/***
我想要什么
我想要得到的结果是
-flag testdir/dir\ with\ spaces/1.sh
-flag testdir/dir\ with\ spaces/2.sh
-flag testdir/dir\ with\ spaces/subdir
-flag testdir/dir\ with\ spaces/subdir/subfile.sh
-flag testdir/dir1
-flag testdir/dir1/file.sh
-flag testdir/test.sh
我尝试的
pathpattern=testdir/**/*
echo $pathpattern
它打印以下内容
testdir/dir with spaces/1.sh testdir/dir with spaces/2.sh testdir/dir with spaces/subdir testdir/dir1/file.sh
printf -- "-flag %q\n" testdir/**/*
然而,这看起来可能是一个非常糟糕的方式来完成。。。某物如果不知道实际的最终目标,就很难建议如何正确地完成它。通常,您不希望生成包含文件名的变量或字符串(更不用说命令了),如果这样做,您可能应该改用数组。但也许你只是想
for file in testdir/**/*; do
: ... something with "$file"
done
阵列解决方案看起来像
#!/bin/bash
# ^ sh doesn't have arrays
array=($(printf " -test %q" testdir/**/*))
your --program --call ${array[@]} --more arguments
感谢您花时间对此作出回应。要打印的第一个选项显示错误“printf:-f:invalid option”。我已经尝试了第二个选项-它将带有空格的路径分成两个结果。对于您提出的为什么需要这个问题,我正在尝试为我们正在使用的一个api指定排除路径。输入规范使用路径模式来确定要排除的路径;很抱歉。您对
for
循环如何失败的描述听起来好像您没有在循环中对循环变量进行双引号引用。类似于api--call--options$(printf--“-flag%q”)—更多的选项可能会使您避免将结果保留在变量中,因为变量总是令人讨厌的。如果您不能这样做,我建议再次使用数组。有一个常见问题;看见