我的Linux系统中有100个目录,从data001到data100,我希望我的bash脚本根据目录名称重命名所有具有不同扩展名的数据文件.例如,data001目录下的文件应重命名为*001.txt和*001.nc,data002目录下的文件应重命名为*002.txt和*002.nc,依此类推.我有执行该工作的bash脚本,但当我try 重新运行该脚本时,它重复了该名称,例如,data001-*001001.txt*001_001.nc.我想确保如果我重新运行脚本,代码不会影响命名格式.

#!/bin/bash
for ((ii=1; ii<=100; ii++))
do
    dirname=$(printf "data%03d" $ii)
    for file in $dirname/*
    do
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename_without_ext="${filename%.*}"
        newname=$(printf "%s_%03d.%s" "$filename_without_ext" $ii "$extension")
        
        # Skip if the file is already in the desired format
        if [[ "$filename_without_ext" != *"_${ii}" ]]; then
            mv "$file" "$dirname/$newname"
        fi
    done
done

推荐答案

*"_${ii}"的字符串插值法不会按照预期的方式生成后缀.

> ii=3
> echo "_${ii}"
_3

但我猜你在格式比较中会得到_003分.

我建议你事先准备好预期格式的suffix,然后在整个 playbook 中使用它.

#!/bin/bash
for ((ii=1; ii<=100; ii++))
do
    dirname=$(printf "data%03d" $ii)
    for file in $dirname/*
    do
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename_without_ext="${filename%.*}"
        suffix=$(printf "_%03d" $ii)
        newname=$(printf "%s%s.%s" "$filename_without_ext" "$suffix" "$extension")

        # Skip if the file is already in the desired format
        if [[ "$filename_without_ext" != *"$suffix" ]]; then
            mv "$file" "$dirname/$newname"
        fi
    done
done

Linux相关问答推荐

无法分析nasm中的单词

在查找命令中使用 printf

AWK:按第一列匹配两个文件不起作用

Linux 上 Ada 任务优先级的语义是什么?

AWK 命令根据另一列中相同的值获取列中的不同值

Linux 'column' 实用程序的使用

RabbitMQ 安装后没有自动启动

linux shell获取多文件交集

为什么我的 Docker 进程不断在我的 Raspberry Pi 上重新启动?

命令应在终端关闭后继续运行

ENQCMD 指令的好处和微操作是什么?

如何将通配符参数传递给 bash 文件

如何优雅地退出 X11 事件循环?

哪个程序在给定任何文件的情况下创建一个 C 数组?

如何在 UNIX 上的 $PATH 中转义冒号 (:)?

如何在 Ubuntu 12.04 中更改 Jenkins 安装的端口号

从命令行导入 PostgreSQL CSV

Docker:您是否try 连接到没有 TLS 的启用 TLS 的守护进程?

如何将 ISO8859-15 转换为 UTF8?

如何通过命令行识别特定的 Linux 风格?