我有两个包含不等数量图片的目录:
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.png
和0005.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
它存储plot1
中plot2
和$delta
之间的差异,然后在plot2
中为超过{{1}的每个文件名制作最后一个可用图表的副本}。但是,它还没有奏效。感谢帮助。
答案 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