【问题标题】:Run Script throughout all files in a directory in linux [duplicate]在linux目录中的所有文件中运行脚本[重复]
【发布时间】:2021-04-20 20:13:22
【问题描述】:

我有一个名为“bin”的目录,其中有一个名为“GetMaxFreqs”的脚本

要执行它,我需要做:

./GetMaxFreqs -w file.freqs file.wav

在“bin”文件夹中,我有一个名为“dataset”的文件夹,其中有 100 个“.freqs”和 100 个“.wav”文件,我想运行脚本来自动执行“GetMaxFreqs”。

我试过了:

for f in database/*.wav; do ./GetMaxFreqs -w "$f".freqs *.wav; done

和:

for f in database/*.wav; do ./GetMaxFreqs -w "$f".freqs "$f".wav; done

但是在第一个中,每个填充物的输出都是相同的,而在第二个中它给出了一个错误。

【问题讨论】:

  • 在第二个示例命令中,"$f".wav 不应该是"$f" 吗?注意:首先备份 database 所在的整个树。
  • 但在第二个命令中我需要选择 .wav 文件,否则程序无法运行

标签: linux ubuntu


【解决方案1】:

我想你想要basename

假设你想调用./GetMaxFreq -w somefile.freqs somefile.wav,并且假设文件名中没有空格,那么试试这个:

for w in database/*.wav; do
  f=${basename $w}.freqs
  ./GetMaxFreqs -w $f $w
done

如果你有空格试试这个:

for w in database/*.wav; do
  f="${basename $w}.freqs"
  ./GetMaxFreqs -w "$f" "$w"
done

【讨论】:

  • 文件名有空格,还有一些字符,歌曲的名字,所以格式如下:“50 cent - in da club”
  • 我已经更新了我的回复。再说一遍:关键是你需要“basename”。如果它适合你,请回帖。
  • 它有这个错误 "bash: ${basename $w}.freqs: bad replacement" 我不知道它是否与你的代码有关,但我需要获取 .freqs 和 .freqs 文件。 wav 位于数据库文件夹中,因此当您执行此部分时: "./GetMaxFreqs -w "$f" "$w"" 不应该像:"./GetMaxFreqs -w database/"$f" 数据库/"$w" " ??
【解决方案2】:

这类似于 paulsm4 的解决方案...它对我有用(假设您希望两个文件名相同,例如 file1.freqs 和 file1.wav):

for w in database/*.wav; do
    f=`basename -s .wav $w`.freqs;
    ./GetMaxFreqs -w database/$f $w;
done;

希望我明白你的意思。

after running the script

【讨论】:

  • 它似乎是正确的,但不知何故它不起作用,它说音频文件不正确,这意味着“$w”部分不正确,您是否也从文件夹数据库?
  • 我再次检查...通过运行 bin 目录中的 ./GetMaxFreqs 以及名为 database 的子目录中的所有其他文件。它再次起作用了。我什至在 bin 目录中运行了以下脚本: echo "Hello" > $w 并且成功了。
猜你喜欢
  • 2019-02-04
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
相关资源
最近更新 更多