首页 > 解决方案 > 如何使用 shell 脚本正确处理文件名

问题描述

我想用一些 shell 脚本来评估我最新文件夹中的最新文件名。所以我得到了最新的文件夹名称和其中的最新文件名:

latest_folder=$(ls -td */ | head -n 1)
echo $latest_folder
cd $latest_folder
latest_file="$(ls -t *$str | head -n 1)"
echo $latest_file

文件夹结构:

base_folder
    |
    |---000
    |     |---123.*
    |     |---124.*
    |     |---...
    |     |---999.*
    |
    |---001
    |     |---997.*
    |     |---998.*
    |     |---999.*

其中 001 是最新的文件夹。如果此文件夹中的最新文件等于 999.* 我需要创建一个新文件夹 002。

任何人的想法?

标签: bashshell

解决方案


你的想法并不遥远。我建议不要使用最新的可怕内容,只需使用相同的方案通过附加您的命令替换cd来获取该文件夹中的最新文件。latest_folder/

一旦你有了latest_file,你可以简单地使用带有子字符串删除的参数扩展来隔离前三位数字(例如filenum="${latest_file%%.*}")。之后,您可以根据filenum.

如果您确实需要创建一个新目录,则可以使用printf -v字段宽度修饰符和'0'填充来通过简单地添加数字来格式化您的new_folder名称,例如注意:这是在从to删除前导零之后添加以获取数字时,防止解释为八进制常量,例如.0021latest_folderprintf -v new_folder "%03d" $((latest_folder + 1))latest_folder1new_folder$((latest_folder + 1))

总而言之,您应该能够执行以下操作:

#!/bin/bash

limit=999

latest_folder="$(ls -td */ | head -n 1)"                ## latest folder
latest_folder="${latest_folder:0:(-1)}"                 ## remove / at end
latest_file="$(ls -t "$latest_folder/" | head -n 1)"    ## latest file
filenum="${latest_file%%.*}"                            ## isolate ###
if ((filenum == limit)); then                           ## if ### = 999
    n=0
    while [ "${latest_folder:n:1}" = '0' ]; do          ## remove zeros
        latest_folder="${latest_folder:$((n+1))}"
        ((n++))
    done
    printf -v new_folder "%03d" $((latest_folder + 1))  ## new folder name
    mkdir -p new_folder                                 ## create new folder
fi

注意:您通常应该使用findandsort来获取目录和文件名列表(使用-maxdepthand-type来控制搜索的文件/目录的深度和类型)

如果您有任何问题,请告诉我。


推荐阅读