2017-07-19 109 views
0

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

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) 

这是我有,但它依赖于两个迪尔斯具有相同名称:

cp Dir1/* OutputDir/ 
cp --backup=existing --suffix=.2 Dir2/* OutputDir/ 
cd OutputDir 
# next line from here: https://stackoverflow.com/questions/3211595/renaming-files-in-a-folder-to-sequential-numbers 
ls | cat -n | while read n f; do mv "$f" "$n.jpg"; done 

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

回答

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中的文件数量相同,但您的示例意味着这是真的。

+0

您可能希望完全删除*命令替换*和'ls',只允许* globbing *来填充数组。但是,你和ghoti都会得到几乎同时答案的投票':)'我仍然困惑于哪个文件获得下一个序号逻辑(或缺少逻辑)的逻辑。 –

+0

非常感谢。完成。 – Gene

+0

我忘了说明,但是两个目录都有相同数量的文件。 –

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++))仅在移动成功时才会执行,这应确保您的输出文件连续不间断。

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

+0

在蛋糕上结冰应该是((n> = 1000))&& break'':)' –

+0

@ DavidC.Rankin - 这个更新是如何结冰的? :) – ghoti

+0

如果我可以投票两次 - 这将是值得两倍。就像我对Gene评论的那样,当你们俩都回答的时候,我仍然在想如何排列哪个文件的序列号。干得好':)' –

相关问题