【问题标题】:Renaming Maildir Messages as "Read" or Not Read将 Maildir 消息重命名为“已读”或未读
【发布时间】:2014-08-20 20:14:55
【问题描述】:

我需要管理我的服务器的 maildir 消息。

我需要知道如何有效地将单个消息文件重命名为已经 [R]ead,反之亦然,最好使用标准 bash。

1408429273.V825I1cce0a1M366263.server0:2,S
1408500713.V825I1ccddaaM341812.server0:2,S
1408502356.V825I1ccddf3M195155.server0:2,S
1408502501.V825I1cce048M253486.server0:2,RS

如果一个文件已经被标记为 [R]ead,我不想再被它绊倒,或者更糟的是,错误地重命名它。

【问题讨论】:

  • 感谢您的编辑。就像在通常的 Linux 命令中一样,-- 用于将命令参数作为文件传递在它之后,即使它们是否以破折号开头,也不会抛出有关错误选项的错误。

标签: bash maildir


【解决方案1】:

试试:

#!/bin/bash
shopt -s nullglob
for F in /path/to/files/*:*,*; do
    CODE=${F##*,}
    [[ $CODE != *R* ]] && echo mv "$F" "${F%,*},R${CODE}"
done

确认 echo 工作正常后删除它。

更严格:

#!/bin/bash
shopt -s nullglob
shopt -s extglob
for F in /path/to/files/*:+([0-9]),*([A-Z]); do
    CODE=${F##*,}
    [[ $CODE != *R* ]] && echo mv "$F" "${F%,*},R${CODE}"
done

重命名为未读:

#!/bin/bash
shopt -s nullglob
shopt -s extglob
for F in /path/to/files/*:+([0-9]),*([A-Z]); do
    CODE=${F##*,}
    [[ $CODE == *R* ]] && echo mv "$F" "${F%,*},${CODE//R}"
done

脚本:

#!/bin/bash

shopt -s extglob

CHANGE_MODE=''
FILES=()

function show_usage_and_exit {
    echo "Usage: $0 option [--] file [file2 ...]" >&2
    echo "Options:" >&2
    echo "  -r, --read    Add read flag to filenames." >&2
    echo "  -u, --unread  Remove read flag from filenames." >&2
    exit 1
}

while [[ $# -gt 0 ]]; do
    case "$1" in
    -r|--read)
        CHANGE_MODE='R'
        shift
        ;;
    -u|--unread)
        CHANGE_MODE='U'
        shift
        ;;
    -h|--help)
        show_usage_and_exit
        ;;
    --)
        shift
        FILES+=("$@")
        break
        ;;
    -*)
        echo "Invalid option: $1" >&2
        show_usage_and_exit
        ;;
    *)
        FILES+=("$1")
        ;;
    esac
    shift
done

if [[ -z $CHANGE_MODE ]]; then
    echo "No mode specified."
    show_usage_and_exit
elif [[ ${#FILES[@]} -eq 0 ]]; then
    echo "No file was specified."
    show_usage_and_exit
else
    for F in "${FILES[@]}"; do
        if [[ ! -f $F ]]; then
            echo "File does not exist or is not a file: $F" >&2
            exit 1
        elif [[ $F != *:+([0-9]),*([A-Z]) ]]; then
            echo "File format is not recognized: $F" >&2
            exit 1
        fi
    done
fi

if [[ $CHANGE_MODE == R ]]; then
    for F in "${FILES[@]}"; do
        CODE=${F##*,}
        [[ $CODE != *R* ]] && echo mv "$F" "${F%,*},R${CODE}"
    done
else
    for F in "${FILES[@]}"; do
        CODE=${F##*,}
        [[ $CODE == *R* ]] && echo mv "$F" "${F%,*},${CODE//R}"
    done
fi

【讨论】:

  • 谢谢。这是一个正确的答案,对您的示例脚本进行了少量更正。非常健壮。不幸的是,我不能投票,因为我在这个网站上没有问足够多的问题。 :\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多