【问题标题】:Rename files in a directory the simplest way in a script在脚本中最简单的方法重命名目录中的文件
【发布时间】:2016-03-08 19:46:35
【问题描述】:

我想编写一个脚本,在没有它的文件末尾添加“0”。

这是我写的:

#!/bin/bash
for file in $1
do
    echo $file

    ls $file | grep "\0$"

    if ["$?"="1"] 
    then

    fi

done

我不知道如何以可以重命名的方式定位文件

【问题讨论】:

    标签: unix rename


    【解决方案1】:
    for file in *[!0]; do mv "$file" "${file}0"; done
    

    对于每个不以0 结尾的名称,重命名它。请注意,这会处理其中包含空格等的名称。


    我想给脚本一个目录,它会重命名其中不以 0 结尾的文件。我如何使用它来告诉脚本使用哪个目录?

    所以,做一些必要的小改动,使用一个目录(如果指定了多个目录,不要拒绝命令行;只是默默地忽略额外内容):

    for file in "${1:?}"/*[!0]; do mv "$file" "${file}0"; done
    

    "${1:?}" 表示法确保 $1 已设置且不为空,如果不是,则生成错误消息。你也可以改写"${1:-.}";这将适用于当前目录而不是远程目录。然后 glob 生成该目录中不以 0 结尾的文件名列表,并重命名它们以便它们这样做。如果你有 Bash,你可以使用shopt -s nullglob,如果目录中没有没有0 后缀的文件,你不会遇到问题。

    你可以泛化处理任意数量的参数(都应该是目录,如果没有指定目录,则默认为当前目录):

    for dir in "${@:-.}"
    do
        for file in "$dir"/*[!0]; do mv "$file" "${file}0"; done
    done
    

    或者(强制目录):

    for dir in "${@:-.}"
    do
        (cd "$dir" && for file in *[!0]; do mv "$file" "${file}0"; done)
    done
    

    这具有报告哪些参数不是目录或不可访问目录的优点。

    这种类型的变化无穷无尽;其中一些甚至可能有用。


    现在,我想做同样的事情,但是脚本应该重命名不以“.0”结尾的文件,而不是以“0”结尾的文件,以便它们以“.0”结尾'?

    由于修改了结尾,这有点棘手。仅仅使用[!.][!0] 是不够的。例如,如果文件列表包括30x.0x0z.9z1,则echo *[!.][!0]仅列出z1(省略30x0和@ 987654345@ 不以.0 结尾)。

    我可能会改用这样的东西:

    for dir in "${@:-.}"
    do
        (
        cd "$dir" &&
        for file in *
        do
            case "$file" in
            (*.0) : skip it;;
            (*)   mv "$file" "${file}0";;
            esac
        done
        )
    done
    

    另一种选择列出了更多 glob 模式:

    for dir in "${@:-.}"
    do
        (cd "$dir" && for file in *[!.][!0] *.[!0] *[!.]0; do mv "$file" "${file}0"; done)
    done
    

    请注意,如果您想查找不以 .00 结尾的文件,这将变得非常棘手——将有 7 个 glob 表达式(但 case 变体同样可以直接工作),以及 shopt -s nullglob变得越来越重要(或者您需要[ -f "$file" ] && mv "$file" "${file}.0" 而不是更简单的移动命令)。

    【讨论】:

    • 我怎样才能以一种我可以告诉脚本哪个目录工作的方式使用它?
    • 它有效。现在,我想做同样的事情,但是用 '.0' 代替 '0'。该脚本无法识别名为 30 的文件。我猜这是因为“。”用作某种通配符,替换 '3' ?
    • 那么,您想重命名不以.0 结尾的文件,使它们以.0 结尾?这更复杂,因为识别模式更复杂。请确认我已正确解释您的要求(回复评论)。
    • 是的,这就是我想要做的。
    猜你喜欢
    • 2015-08-02
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多