首页 > 解决方案 > 使用 Bash 成对列出文件

问题描述

我在一个目录中有一组文件。它们是每个文件名的左右音轨。我希望它们被 bash 列为filename_l filename_r以便我可以使用 sox 将每个合并在一起。但是我对 bash 循环没有任何运气。

我需要循环中列出的文件为 1-2 3-4 5-6 7-8 9-10 11-12 等等。但我不知道该怎么做。

-rwxrwxrwx  1 jason jason  653K Oct 25 14:24 05_wasteland2_str_l.ogg
-rwxrwxrwx  1 jason jason  648K Oct 25 14:24 05_wasteland2_str_r.ogg
-rwxrwxrwx  1 jason jason  1.5M Oct 25 14:24 amb0010_l.ogg
-rwxrwxrwx  1 jason jason  1.5M Oct 25 14:24 amb0010_r.ogg
-rwxrwxrwx  1 jason jason  1.4M Oct 25 14:24 amb0016_l.ogg
-rwxrwxrwx  1 jason jason  1.4M Oct 25 14:24 amb0016_r.ogg
-rwxrwxrwx  1 jason jason  2.9M Oct 25 14:24 amb0017_l.ogg
-rwxrwxrwx  1 jason jason  2.9M Oct 25 14:24 amb0017_r.ogg
-rwxrwxrwx  1 jason jason  2.6M Oct 25 14:24 amb0019_l.ogg
-rwxrwxrwx  1 jason jason  2.6M Oct 25 14:24 amb0019_r.ogg
-rwxrwxrwx  1 jason jason  1.8M Oct 25 14:24 amb001_l.ogg
-rwxrwxrwx  1 jason jason  1.8M Oct 25 14:24 amb001_r.ogg
-rwxrwxrwx  1 jason jason  2.0M Oct 25 14:24 amb006_l.ogg
-rwxrwxrwx  1 jason jason  2.0M Oct 25 14:24 amb006_r.ogg
-rwxrwxrwx  1 jason jason  1.9M Oct 25 14:24 amb007_l.ogg
-rwxrwxrwx  1 jason jason  1.9M Oct 25 14:24 amb007_r.ogg
-rwxrwxrwx  1 jason jason  4.5M Oct 25 14:24 amb01_l.ogg
-rwxrwxrwx  1 jason jason  4.5M Oct 25 14:24 amb01_r.ogg
-rwxrwxrwx  1 jason jason  3.0M Oct 25 14:24 amb02_l.ogg
-rwxrwxrwx  1 jason jason  3.0M Oct 25 14:24 amb02_r.ogg
-rwxrwxrwx  1 jason jason  2.5M Oct 25 14:24 amb03_l.ogg
-rwxrwxrwx  1 jason jason  2.5M Oct 25 14:24 amb03_r.ogg
-rwxrwxrwx  1 jason jason  2.2M Oct 25 14:24 amb04_l.ogg
-rwxrwxrwx  1 jason jason  2.2M Oct 25 14:24 amb04_r.ogg
-rwxrwxrwx  1 jason jason  2.3M Oct 25 14:24 amb05_l.ogg
-rwxrwxrwx  1 jason jason  2.3M Oct 25 14:24 amb05_r.ogg

我尝试了这个 bash 循环,但它不能满足我的需要,但我肯定缺少一些小东西。

declare -a files=(*.ogg)
for (( i = 0; i < ${#files[*]}; ++ i ))
do
  echo ${files[$i]} ${files[$i+1]}

done

总共有 486 个文件,手动执行此操作会占用过多的登录并且容易出错。我尝试过的每个循环都有 1-2 2-3 3-4 4-5 等等,我需要这样做以不同的方式工作,因此每个文件都与它的合作伙伴一起列出。我现有的循环给出了这个输出。

05_wasteland2_str_l.ogg 05_wasteland2_str_r.ogg
05_wasteland2_str_r.ogg amb0010_l.ogg
amb0010_l.ogg amb0010_r.ogg
amb0010_r.ogg amb0016_l.ogg
amb0016_l.ogg amb0016_r.ogg
amb0016_r.ogg amb0017_l.ogg
amb0017_l.ogg amb0017_r.ogg
amb0017_r.ogg amb0019_l.ogg
amb0019_l.ogg amb0019_r.ogg
amb0019_r.ogg amb001_l.ogg
amb001_l.ogg amb001_r.ogg
amb001_r.ogg amb006_l.ogg
amb006_l.ogg amb006_r.ogg
amb006_r.ogg amb007_l.ogg
amb007_l.ogg amb007_r.ogg
amb007_r.ogg amb01_l.ogg
amb01_l.ogg amb01_r.ogg
amb01_r.ogg amb02_l.ogg
amb02_l.ogg amb02_r.ogg

这不是我所追求的。但我希望有一个简单的解决方案来解决这个问题。

我希望能够输出这个。

05_wasteland2_str_l.ogg 05_wasteland2_str_r.ogg

对于每个文件,_l 和 _r。我希望能够使用 sox 来合并每对文件。

这样我就可以使用它来合并文件。

袜子-M 05_wasteland2_str_l.ogg 05_wasteland2_str_r.ogg 05_wasteland2_merged.ogg

但是我发现成对列出文件是非常困难的。这最终可能会非常具有挑战性。

标签: bashloopsscripting

解决方案


您可以使用以下事实,即有一对其他名称相同的文件_l_r

for f in *_l.ogg; do
    echo "$f" "${f/%_l.ogg/_r.ogg}"
done

这将遍历所有以 结尾的文件_l.ogg,然后将这些文件对与_l.ogg(锚定在字符串末尾)被替换的文件一起打印出来_r.ogg


推荐阅读