【问题标题】:Bash Script checking for files with certain extensionBash 脚本检查具有特定扩展名的文件
【发布时间】:2019-02-22 23:35:59
【问题描述】:

我正在尝试构建一个 .sh-Script 来帮助我清理一个巨大的画廊文件夹。这是我第一次使用 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]”线上。这是purley编造的,因为我不知道该怎么做。非常感谢任何帮助

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;

【问题讨论】:

  • 很酷的脚本。但是你没有在那个脚本中cd $fif [ DIRECTORY == "*.jpg_backup" ] 行应该做什么?它应该执行4 的步骤? this 有帮助吗? if ls "$f"/*.jpg_backup >/dev/null 2>/dev/null ? [ -d /thumbs 检查/ dire 中的thumbs 目录,rm -r thumbs/ 删除当前工作目录中的 thumb 目录,这些不相关...

标签: bash shell


【解决方案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

参考资料:

【讨论】:

    【解决方案2】:

    您没有使用循环中的 $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
    

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

    【讨论】:

    • 非常感谢,但由于某种原因它什么也没做,甚至没有输出错误..
    • set -x放在脚本开头可以看到执行的痕迹。
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多