如何使用外壳脚本正确处理文件名



我想用一些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。

有人有想法吗?

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

有了latest_file,您可以简单地使用参数扩展和子字符串删除来隔离前导 3 位数字(例如filenum="${latest_file%%.*}"(。之后,您可以根据filenum决定是否需要新目录。

如果您确实需要创建一个新目录,则 use can 可以使用printf -v来利用字段宽度修饰符和'0'填充来格式化您的new_folder名称002,只需将1添加到latest_folder数字,例如printf -v new_folder "%03d" $((latest_folder + 1))注意:这是在从latest_folder中删除前导零以防止在添加1以获得new_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

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

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

最新更新