我试图找到模式中的所有路径而且我被卡住了。这是目录
的结构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
答案 0 :(得分:1)
这应该这样做。
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