2017-03-16 86 views
1

我正在尝试查找模式中的所有路径,并且卡住了。这是目录Shell脚本:识别模式中的所有路径

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 
  1. 我想这样做的路径模式的回声,但它没有返回的一切。
  2. 我也不知道处理有空间的条目。我尝试循环遍历$ pathpattern,但未能区分新路径和有空间的路径。

回答

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 
+0

感谢您抽出时间来对此作出回应。第一个打印选项给我错误“printf:-f:无效选项”。我已经尝试了第二种选择 - 它将具有空格的路径分成两个结果。对于你为什么我需要这个问题 - 我试图为我们正在使用的API之一指定排除路径。输入规范使用路径模式来确定要排除的路径。 – Subbu

+0

我编辑了解决'printf'错误的答案;对于那个很抱歉。你对'for'循环失败的描述听起来像是你没有在循环内引用循环变量的双引号。 – tripleee

+0

类似于'api --call --options $(printf - “-flag%q”) - 更多的选项'可能会让你无法将结果保存在一个始终讨厌的变量中。如果你不能再这样做,我建议使用一个数组。有关于此的常见问题;见http://mywiki.wooledge.org/BashFAQ/050 – tripleee