我有两个带有顺序内容的目录(即内容'文件名是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)
我希望一个不依赖于两个目录的文件名的解决方案是相同的。
答案 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++))
仅在移动成功时执行,这应该确保您的输出文件是连续的而不会中断。
这里的依赖是数组索引必须是顺序的,没有中断。