在递增名称时,在目录中复制最后一个文件几次

时间:2016-04-04 19:53:31

标签: bash

我有两个包含不等数量图片的目录:

ls plot1 -> 0001.png 0002.png 0003.png 0004.png 0005.png
ls plot2 -> 0001.png 0002.png 0003.png

图片名称是前导零和前缀.png的数字。我需要多次复制plot2目录中的最后一张图片,文件数等于目录plot1。文件名必须递增:plot2/0003.png被复制到0004.png0005.png

ls plot1 -> 0001.png 0002.png 0003.png 0004.png 0005.png
ls plot2 -> 0001.png 0002.png 0003.png 0004.png 0005.png #last two files are copies of 0003.png

我该怎么做? (特别是递增文件名?)

我知道我可以使用find获取文件夹中的最后一个文件。但这就是我的知识结束的地方......

find plot2 -type f | sort -V | tail -n 1
-> ./0003.png

修改 我认为一个潜在的解决方案是这样的:

delat= $(expr `ls plot1 | wc -l` - `ls plot2 | wc -l`)
for i in find . -type f | sort -V | tail -n $delta
  cp `find plot2 -type f | sort -V | tail -n 1` i

它存储plot1plot2$delta之间的差异,然后在plot2中为超过{{1}的每个文件名制作最后一个可用图表的副本}。但是,它还没有奏效。感谢帮助。

4 个答案:

答案 0 :(得分:0)

这完成了这项工作。然而,很可能有更好的方法。

delta="$((`ls plot1 | wc -l` - `ls plot2 | wc -l`))"
last=$(find plot2 -type f -printf "%f\n" | sort -V | tail -n 1)
for i in $(find plot1 -type f -printf "%f\n" | sort -V | tail -n $delta)
do
  cp plot2/$last plot2/$i
done

答案 1 :(得分:0)

如果您希望在plot2中拥有相同的文件名,并希望为此复制文件plot2/0003.png,则可以复制到尚不存在的所有文件。如果可以使用[ -f "${file}" ]选项,则无需测试cp -n

for file in plot1; do
   cp -n plot2/0003.png "${file/plot1/plot2}"
done

答案 2 :(得分:0)

getlast() { ls -1 "$1" | sort -n | tail -1; };

plot1=$(getlast plot1); plot2=$(getlast plot2);
target=${plot1%.png}; from=${plot2%.png};
for ((i=$from+1; i<=$target; i++)); do 
    n=$(printf "%04d.png" $i); 
    cp plot2/$plot2 plot2/$n; 
done

答案 3 :(得分:0)

此解决方案仅使用Bash和&#39; cp&#39;:

# Protect against empty directories
shopt -s nullglob

plot1_files=( plot1/[0-9][0-9][0-9][0-9].png )
plot2_files=( plot2/[0-9][0-9][0-9][0-9].png )

declare -i plot1_count=${#plot1_files[*]}
declare -i plot2_count=${#plot2_files[*]}

# Exit if the directories are not set up appropriately
(( plot2_count == 0 )) && exit 1
(( plot2_count >= plot1_count )) && exit 1

plot2_lastfile=${plot2_files[-1]}
plot2_lastbase=${plot2_lastfile##*/}
declare -i plot2_lastnum=10#${plot2_lastbase%.png}

plot2_srcfile=$plot2_lastfile

while (( plot2_count < plot1_count )) ; do
    plot2_lastnum+=1
    printf -v plot2_lastfile 'plot2/%04d.png' "$plot2_lastnum"
    cp -- "$plot2_srcfile" "$plot2_lastfile"
    plot2_count+=1
done

不假设图像编号是连续的。它不假设plot2中的所有图像文件名也存在于plot1中。例如,它适用于:

ls plot1 -> 0001.png  0003.png  0005.png  0007.png  0009.png
ls plot2 -> 0006.png  0008.png  0010.png