将两个目录的内容交织到一个新目录中

时间:2017-07-19 02:14:21

标签: bash

我有两个带有顺序内容的目录(即内容'文件名是001.jpg,002.jpg,003.jpg等等,最多可达1000个文件)。我想以交替顺序将它们合并到一个新目录中,如下所示:

const remote = require('electron').remote;
var testGlobal = remote.getGlobal('mainState')
testGlobal.settings = 'test value'
testGlobal.settings.inner = 'test value2'

这就是我所拥有的,但它依赖于具有相同名称的两个目录:

Dir1
├── 001.jpg
├── 002.jpg
├── 003.jpg
└── 004.jpg
Dir2
├── 002.jpg
├── 003.jpg
├── 004.jpg
└── 005.jpg

OutputDir
├── 001.jpg (001.jpg from Dir1)
├── 002.jpg (002.jpg from Dir2)
├── 003.jpg (002.jpg from Dir1)
├── 004.jpg (003.jpg from Dir2)
├── 005.jpg (003.jpg from Dir1)
├── 006.jpg (004.jpg from Dir2)
├── 007.jpg (004.jpg from Dir1)
└── 008.jpg (005.jpg from Dir2)

我希望一个不依赖于两个目录的文件名的解决方案是相同的。

2 个答案:

答案 0 :(得分:2)

这是单向的。

#! /bin/bash
a=(Dir1/*)
b=(Dir2/*)
for ((i=0;i<${#a[@]};++i)); do
  mv "${a[i]}" "OutputDir/$(printf '%03d.jpg' "$((2*i+1))")"
  mv "${b[i]}" "OutputDir/$(printf '%03d.jpg' "$((2*i+2))")"
done

它确实假设Dir1和Dir2中的文件数量相同,但您的示例意味着它是真的。

答案 1 :(得分:2)

假设两个输入目录中的文件数相同,您可以简单地逐步执行数组索引,如下所示:

#!/usr/bin/env bash

a=(Dir1/*.jpg)
b=(Dir2/*.jpg)
n=1

for i in "${!a[@]}"; do
    mv "${a[$i]}" "OutputDir/$( printf '%03d' $n ).jpg"
    ((n++))
    mv "${b[$i]}" "OutputDir/$( printf '%03d' $n ).jpg"
    ((n++))
done

如果有可能他们会有不同数量的文件,你需要为此定义行为并写一些东西来处理它。也许这个:

#!/usr/bin/env bash

a=(Dir1/*.jpg)
b=(Dir2/*.jpg)

if [[ ${#a[@]} -gt ${#b[@]} ]]; then
        c=( ${!a[@]} )
else
        c=( ${!b[@]} )
fi

n=1

for i in "${c[@]}"; do
    echo "i=$i"
    [[ -f "${a[$i]}" ]] &&
      mv -v "${a[$i]}" "OutputDir/$( printf '%03d' $n ).jpg" && ((n++))
    [[ -f "${b[$i]}" ]] &&
      mv -v "${b[$i]}" "OutputDir/$( printf '%03d' $n ).jpg" && ((n++))
done

使用此解决方案,如果一个目录的文件多于另一个目录,则应将其文件按顺序附加到OutputDir后面的相同计数器。请注意,((n++))仅在移动成功时执行,这应该确保您的输出文件是连续的而不会中断。

这里的依赖是数组索引必须是顺序的,没有中断。

相关问题