Bash 将Maildir邮件重命名为";改为;还是不读

Bash 将Maildir邮件重命名为";改为;还是不读,bash,maildir,Bash,Maildir,我需要管理服务器的maildir消息 我需要知道如何高效地将单个消息文件重命名为已[R]ead,或者反之亦然,最好使用标准bash 1408429273.V825I1cce0a1M366263.server0:2,S 1408500713.V825I1ccddaaM341812.server0:2,S 1408502356.V825I1ccddf3M195155.server0:2,S 1408502501.V825I1cce048M253486.server0:2,RS 如果一个文件已经标记

我需要管理服务器的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,我不想再被它绊倒,或者更糟糕的是,重命名错误。

尝试:

#!/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

谢谢你的编辑。与通常的Linux命令一样,
--
可以使命令参数作为文件传递,即使它们是否以破折号开头,也不会抛出错误选项。谢谢。这是一个正确的答案,对示例脚本进行了一些小的修改。非常健壮。不幸的是,我不能投票,因为我在这个网站上问的问题不够多\