![Bash:检查文件名的唯一性,以及重命名或删除文件](https://linux22.com/image/572179/Bash%EF%BC%9A%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%94%AF%E4%B8%80%E6%80%A7%EF%BC%8C%E4%BB%A5%E5%8F%8A%E9%87%8D%E5%91%BD%E5%90%8D%E6%88%96%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6.png)
我在 CentOS 中使用 bash 工作,目录中有如下文件:
16948.png
16948_thumb.png
16948-1_thumb.png
16949.png
16948_thumb.png
16949-1_thumb.png
16950-1.png
16950-1_thumb.png
16950-2.png
16950-2_thumb.png
我想做以下事情:
- 对于每个唯一编号 N存在于文件列表中:
- 检查是否存在文件 N-1.png:
- 如果没有,则通过将 N.png 复制到 N-1.png 来创建它(始终会有一个 N.png)
- 删除文件 N.png
- 检查是否存在文件 N-1_thumb.png:
- 如果没有,请通过将 N_thumb.png 复制到 N-1_thumb.png 来创建它(总会有一个 N_thumb.png)
- 删除文件 N_thumb.png。
但是,我的 shell 脚本编写能力还不够好,无法达到这个水平。这是我能做到的极限了 - 有人能帮忙吗?
#!/bin/sh
declare -a unique_numbers
for filename in ./images
do
// split filename at - or _ to get N, and then check
// whether N is already in list of unique numbers
// if it is, skip
continue
// if it isn't, append to unique_numbers
unique_numbers+=(N)
// then check whether there is a file N-1.png.. etc
done;
答案1
如果我理解正确的话,这应该可以做到。第一个循环处理所有名为的文件Number.png
,第二个循环处理所有名为的文件Number_thumb.png
。
#!/bin/sh
for number in `ls -1 images/*.png | grep -v thumb | grep -v "-" | cut -f2 -d / | cut -f1 -d .`
do
if [ ! -e "./images/$number-1.png" ] ; then
cp images/"$number.png" images/"$number-1.png"
fi
rm ./images/"$number.png"
done;
for number in `ls -1 images/*.png | grep thumb | grep -v "-" | cut -f2 -d / | cut -f1 -d . | cut -f1 -d _`
do
echo $number
if [ ! -e "./images/$number-1_thumb.png" ] ; then
cp images/"$number"_thumb.png images/"$number-1_thumb.png"
fi
rm ./images/"$number"_thumb.png
done;