Bash:检查文件名的唯一性,以及重命名或删除文件

Bash:检查文件名的唯一性,以及重命名或删除文件

我在 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;

相关内容