有多种方法可以合并目录。难点在于检查target目录中是否已经存在同名文件,然后增加source文件的名称,避免覆盖target。
鉴于您的命名约定 #.TIF,完成此操作的一种方法是扫描 target 目录中的文件并确定 max #。您还需要扫描 源 文件,以解决源文件在目标中不存在的情况。
如果你有一组文件的max #,你只需遍历每个文件,检查它是否已经存在,如果存在,将文件从当前的#移动到目标目录中的# + max。如果文件不存在,只需移动它。这同样适用于目标目录结构中尚不存在的源目录 - 只需移动它即可。
将所有部分放在一起,您可以执行类似于以下的操作,其中脚本将old 目录名称、new 目录名称和ext(默认为TIF)作为参数:
#!/bin/bash
[ -z "$1" -o -z "$2" ] && { ## validate 2 arguments given
printf "error: insufficient input, usage: %s old new\n" "${0##*/}"
exit 1
}
old="$1" ## assign arguments to 'old' and 'new' (readability)
new="$2"
ext="${3:-TIF}"
[ -d "$old" -a -d "$new" ] || { ## validate both old/new are directories
printf "error: invalid input.\n"
[ -d "$old" ] || printf " '%s' is not a directory.\n" "$old"
[ -d "$new" ] || printf " '%s' is not a directory.\n" "$new"
exit 1
}
while read -r dname; do ## for each old directory
max=0 ## zero max
nname="${dname/$old/$new}" ## generate new dir name
if [ -d "$nname" ]; then ## check if new dir exists, if so
## get max file # in old & new
for i in "$dname"/*; do ## for each file in old
[ -f "$i" ] || continue ## skip if not file
fn="${i%.$ext}" ## get the number
fn=${fn#${dname}/}
((fn > max)) && max=$fn ## update max if greater
done
for i in "$nname"/*; do ## do the same for new dir
[ -f "$i" ] || continue
fn="${i%.$ext}"
fn=${fn#${nname}/}
((fn > max)) && max=$fn
done
## move files from old to new
for i in "$dname"/*; do ## for each file in old
[ -f "$i" ] || continue
newfn="${i/$old/$new}" ## form new file name
if [ -f "$newfn" ]; then ## check if it exists, if so
fn="${i%.$ext}"
fn=${fn#${dname}/} ## add max to number and mv
printf "mv %s %s\n" "$i" "${newfn%/*}/$((fn + max)).$ext"
mv "$i" "${newfn%/*}/$((fn + max)).$ext"
else ## otherwise, just mv
printf "mv %s %s\n" "$i" "$newfn"
mv "$i" "$newfn"
fi
done
else ## if no new dir exists, move old new
printf "mv %s %s\n" "$dname" "$nname"
mv "$dname" "$nname"
fi
done < <(find "$old" -type d)
例如,如果您有以下新旧目录结构:
$ tree old
old
├── 22
│ ├── 1.TIF
│ ├── 2.TIF
│ ├── 3.TIF
│ └── 4.TIF
├── 23
│ ├── 1.TIF
│ ├── 2.TIF
│ ├── 3.TIF
│ ├── 4.TIF
│ └── 5.TIF
└── 24
├── 1.TIF
└── 2.TIF
$ tree new
new
├── 22
│ ├── 1.TIF
│ ├── 2.TIF
│ └── 3.TIF
└── 23
├── 1.TIF
├── 2.TIF
└── 3.TIF
该脚本会产生以下结果(您可以删除printf 语句,或将输出重定向到/dev/null 以隐藏文本)
$ bash mvoldnew.sh old new
mv old/24 new/24
mv old/22/1.TIF new/22/5.TIF
mv old/22/2.TIF new/22/6.TIF
mv old/22/3.TIF new/22/7.TIF
mv old/22/4.TIF new/22/4.TIF
mv old/23/1.TIF new/23/6.TIF
mv old/23/2.TIF new/23/7.TIF
mv old/23/3.TIF new/23/8.TIF
mv old/23/4.TIF new/23/4.TIF
mv old/23/5.TIF new/23/5.TIF
现在new 目录树包含以下内容:
$ tree new
new
├── 22
│ ├── 1.TIF
│ ├── 2.TIF
│ ├── 3.TIF
│ ├── 4.TIF
│ ├── 5.TIF
│ ├── 6.TIF
│ └── 7.TIF
├── 23
│ ├── 1.TIF
│ ├── 2.TIF
│ ├── 3.TIF
│ ├── 4.TIF
│ ├── 5.TIF
│ ├── 6.TIF
│ ├── 7.TIF
│ └── 8.TIF
└── 24
├── 1.TIF
└── 2.TIF
如果您有任何问题,或者我误解了您的说明,请查看并告诉我。