bash - 如何使用 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。
任何人的想法?
解决方案
你的想法并不遥远。我建议不要使用最新的可怕内容,只需使用相同的方案通过附加您的命令替换cd
来获取该文件夹中的最新文件。latest_folder/
一旦你有了latest_file
,你可以简单地使用带有子字符串删除的参数扩展来隔离前三位数字(例如filenum="${latest_file%%.*}"
)。之后,您可以根据filenum
.
如果您确实需要创建一个新目录,则可以使用printf -v
字段宽度修饰符和'0'
填充来通过简单地添加数字来格式化您的new_folder
名称,例如注意:这是在从to删除前导零之后添加以获取数字时,防止解释为八进制常量,例如.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
注意:您通常应该使用find
andsort
来获取目录和文件名列表(使用-maxdepth
and-type
来控制搜索的文件/目录的深度和类型)
如果您有任何问题,请告诉我。
推荐阅读
- java - 如何在一个事务期间在 REST API 中正确删除、更新和创建
- maven - Springboot maven war 适用于本地 weblogic 12.2.1.2 但不适用于其他系统
- .net - 使用路由更改页面名称和扩展名
- javascript - 过滤器函数:如何在 Objects JavaScript 中搜索多个键
- regex - 用于匹配特定日志模式的正则表达式
- r - 寻找一个函数来根据 R 中其他值的比率来估算缺失值。(寻找基于概率的)
- javascript - 类型错误:react__WEBPACK_IMPORTED_MODULE_6___default.a.useState 不是函数
- bash - 使用 Shell 将文本文件打印到标准输出以通过数据处理管道的最有效方法
- python - 如何激活 pyenv-venv 环境?
- c++ - 在 C++ 中局部 unordered_map 变量是线程安全的