代码之家  ›  专栏  ›  技术社区  ›  sparks

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

  •  0
  • sparks  · 技术社区  · 5 年前

    我正试图构建一个.sh脚本来帮助我清除一个巨大的图库文件夹。这是我第一次使用bash脚本,但它工作得不太好。

    文件夹结构为:

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

    …等等。

    它应该是这样工作的:

    1. 将在名为“Gallery”的主文件夹中运行
    2. 进入每个文件夹(Gallery1、Gallery2等)
    3. 检查子文件夹是否包含另一个名为“拇指”或“动态”的子文件夹,如果包含,则应将其删除。
    4. 检查文件夹中是否有扩展名为“.jpg”的文件
    5. 如果是,它将删除所有常规.jpg文件
    6. 它将als.jpg的备份重命名为.jpgs

    我这样试过,但我挂在“如果[目录]”线上。这是珀利编的,因为我不知道该怎么做。非常感谢您的帮助

    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 回复  |  直到 5 年前
        1
  •  1
  •   imsky    5 年前
    #!/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
    

    参考文献:

        2
  •  1
  •   Barmar    5 年前

    你没有使用 $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;
    

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

    但所有这些循环似乎都是不必要的。你只需做:

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

    这个 -f 选择权 rename 告诉它允许替换现有文件,因此 rm 不需要命令。