Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell脚本:标识模式中的所有路径_Shell_Sh - Fatal编程技术网

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
  • 我试着做了一个路径模式的回声,但它并没有返回所有内容
  • 我也不知道如何处理有空格的条目。我尝试循环使用$pathpattern,但未能区分新路径和具有空格的路径
  • 这应该可以做到

    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”)—更多的选项
    可能会使您避免将结果保留在变量中,因为变量总是令人讨厌的。如果您不能这样做,我建议再次使用数组。有一个常见问题;看见