【问题标题】:Bash - Directory dependent scriptBash - 目录依赖脚本
【发布时间】:2018-03-11 23:01:34
【问题描述】:

我正在尝试在目录中运行 python 脚本并使用 bash 将此脚本应用于其每个子目录。

我在 unix 堆栈交换上找到了一个脚本,它为一组子目录 here 执行此操作。但我希望它递归地适用于所有子目录

问题是我在父目录中有一个wav.py,但在子目录中没有。

for d in ./*/ ; do (cd "$d" && python3 $1 SA1.wav); done

如您所见,$1 (wav.py) 是我调用 bash 脚本时设置的 python 文件的路径。我还希望路径与我遍历的子目录树的级别相关。我知道我可以使用绝对路径。但这会在以后引起问题,所以我想避免它。

例如。 1级

for d in ./*/ ; do (cd "$d" && python3 "../$1" SA1.wav); done

2 级

for d in ./*/ ; do (cd "$d" && python3 "../../$1" SA1.wav); done

对不起,如果这看起来微不足道。我还是 bash 的新手。

其他信息:

这是我的完整目录路径:

root@Chiku-Y700:/mnt/e/Code/Python - WorkSpace/timit/TIMIT/TEST/DR1# bash recursive.sh wav.py suit rag

我要运行的完整命令是:

python3 $1 SA1.wav $2 SA2.wav $3

$2 和 $3 与任何目录信息无关。

我明白了:

python3: 无法打开文件 '/mnt/e/Code/Python': [Errno 2] 没有这样的文件或目录

这个错误在 11 个子目录中出现了 12 次。

【问题讨论】:

  • 使用脚本的绝对路径有什么问题?如果您正在 cd'ing 到任意深度的子目录,则导出脚本的相对路径可能会非常麻烦。此外,尚不清楚您为什么要遍历子目录。您是否从那里提取任何文件?
  • 我的目录名中有时会有空格。那些没有得到正确解析。并在空格前添加“\”也无济于事。我的子目录也在 4-5 深度后停止
  • 出于好奇,是否可以将目录名称从“Python - Workspace”更改为“Python-Workspace”。就像删除名称中的空格并尝试它。这样您就不必处理脚本中的空间。其次,你能说出 1 美元、2 美元和 3 美元是什么吗?可以指定您要运行的完整脚本(不包括变量),我们很容易理解您在寻找什么。另外我相信当你 cd 进入一个目录时,你应该从你开始的目录出来,因为你给出了相对路径。你可以试试cd -回来。
  • 您可以跳过告诉 $1、$2 和 $3。我重新阅读了您的问题,并且能够得到 $1 是 wav.py。和 $2, $3 只是脚本的参数。

标签: bash directory


【解决方案1】:

让我们看看你的命令,wav.py 是 $1:

for d in ./*/ ; do (cd "$d" && python3 $1 SA1.wav); done

我们是否可以通过使 wav.py 可执行并给它一个 shebang 来降低复杂性,以便您可以直接调用它?然后,您可以将其移动到您的 PATH 或临时将其所在的位置放入路径中。通常最好的习惯是,您的脚本不依赖于调用它的位置,尤其是它不需要位于调用它的同一目录中。

PATH=$PWD:$PATH
for d in ./*/ ; do (cd "$d" && wav.py SA1.wav); done

输入数据不应依赖于相同的目录限制,以便您可以从每个目录调用它,并且数据也可以在任意目录中:

for d in ./*/ ; do wav.py $d/SA1.wav; done

您可能会生成一个输出文件,该文件会写入当前目录,那么您应该从输入目录中提取输出目录(如果这是您一直想要实现的目标),或者让用户指定一个输出目录.默认输出目录可能仍然是输入目录或当前目录。或者您写入 STDOUT,并将输出通过管道传输到您选择的文件。

但你的完整命令是:

python3 $1 SA1.wav $2 SA2.wav $3

这对于简单的命令来说很好,但也许你可以用有意义的方式命名这些参数:

pyprog="$1"
samplerate="$2"
log="$3"

python3 $pyprog SA1.wav $samplerate SA2.wav $log

或者,和之前一样

$pyprog SA1.wav "$samplerate" SA2.wav "$log"

那么,John1024s 的解决方案可能会起作用:

find . -type d -execdir $pyprog SA1.wav "$samplerate" SA2.wav "$log" ";"

如果更改 pyprog 不是一种选择,还有第二种方法可以解决问题:

编写一个包装脚本,将要工作的目录作为参数,并用不同深度的目录对其进行测试。

然后通过 find 调用该包装器:

find . -type d -exec ./wrapper.sh {} ";"

wrapper.sh 应该以:

#/bin/bash
#
#
directory="$1" 

并在需要的地方使用它。

顺便说一句:我也会将Python - WorkSpace 重命名为Python-WorkSpace(更好的是:python-workSpace),因为文件名和路径名中的空格总是会造成麻烦。

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 2018-05-08
    • 2016-07-31
    • 2023-03-06
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多