Bash脚本检查具有特定扩展名的文件

时间:2019-02-22 23:35:59

标签: bash shell

我正在尝试构建.sh脚本来帮助我清除巨大的Gallery文件夹。这是我第一次使用bash脚本,并且运行不正常。

文件夹结构为:

gallery/
    gallery1/
        dynamic/
        thumbs/
        oldfile.jpg_backup
        oldfile.jpg
    gallery2/
        dynamic/
        thumbs/
        oldfile.jpg_backup
        oldfile.jpg

..依此类推。

这是应该如何工作的:

  1. 将在名为“ gallery”的主文件夹中运行
  2. 进入每个文件夹(gallery1,gallery2等)
  3. 检查子文件夹是否包含另一个称为“ thumbs”或“ dynamic”的子文件夹,如果是,则应将其删除
  4. 检查文件夹中是否存在扩展名为“ .jpg_backup”的文件
  5. 如果是,它将删除所有常规.jpg文件
  6. 它将als .jpg_backups重命名为.jpgs

我以这种方式尝试过,但是我挂在“ if [DIRECTORY]”行上。因为我不知道该怎么做,所以弥补了这一点。任何帮助将不胜感激

for f in ~/gallery/*;
    do

    [ -d /thumbs ] && rm -r thumbs/ && echo Thumbs deleted...

    [ -d /dynamic ] && rm -r dynamic/ && echo Dynamic deleted...


    if [ DIRECTORY == "*.jpg_backup" ]
        then 
            rm *.jpg
            rename 's/.jpg_backup/.jpg/' *
    fi

    done;

2 个答案:

答案 0 :(得分:1)

#!/usr/bin/env bash

set -o errexit
set -o xtrace

for d in gallery/*; do
  rm -vrf "$d/thumbs" "$d/dynamic"
  if [[ -n "$(shopt -s nullglob; echo $d/*.jpg_backup)" ]]; then
    rm -rf "$d"/*.jpg
    for f in "$d"/*.jpg_backup; do
      mv -v "$f" "${f%_backup}"
    done
  fi
done

参考文献:

答案 1 :(得分:1)

您不是在循环中使用$f变量来处理每次迭代中的文件和子目录。

for f in ~/gallery/*;
do
    [ -d "$f/thumbs" ] && rm -r "$f/thumbs" && echo "$f/dynamic" deleted...
    [ -d "$f/dynamic" ] && rm -r "$f/dynamic" && echo "$f/dynamic" deleted...
    if compgen -G "$f/*.jpg_backup" >/dev/null
    then 
        rm "$f"/*.jpg
        rename 's/.jpg_backup/.jpg/' "$f"/*.jpg_backup
    fi
done;

我在Test whether a glob has any matches in bash中找到了compgen命令。

但是所有这些循环似乎都是不必要的。您可以这样做:

rm -rf ~/gallery/*/{thumbs,dynamic}
rename -f 's/.jpg_backup/.jpg/' ~/gallery/*/*.jpg_backup

-f的{​​{1}}选项告诉它允许替换现有文件,因此不需要rename命令。