Shell脚本:识别模式中的所有路径

时间:2017-03-16 17:25:36

标签: shell sh

我试图找到模式中的所有路径而且我被卡住了。这是目录

的结构
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 个答案:

答案 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