此代码用于搜索包含名称格式为DD-MM-YYYY的文件的一组文件夹,并将其重命名为YYYY-MM-DD。但是,虽然这个循环在第一次迭代时工作正常,但它并没有解释第二次运行中的正则表达式。
#!/usr/bin/env bash
WORKING_DIRS=( "/directory1" "/directory2" )
for WORKING_DIR in ${WORKING_DIRS[@]}
do
echo "WORKING DIRECTORY : $WORKING_DIR"
echo "--------------------------------------------------------"
for entry in "$WORKING_DIR"/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].doc
do
IFS='/'
read -r -a array <<< "$entry"
file_name="${array[${#array[@]}-1]}"
echo "$file_name"
IFS='.'
read -r -a file <<< "$file_name"
echo "OLD DATE: $file"
IFS='-'
read -r -a file_split <<< "${file[0]}"
day=${file_split[0]}
month=${file_split[1]}
year=${file_split[2]}
new_date="$year-$month-$day"
echo "NEW DATE : $new_date"
mv "$WORKING_DIR"/"$file_name" "$WORKING_DIR"/"$new_date".doc
done
done
答案 0 :(得分:1)
问题在于循环体中的IFS
值修改多次。一旦你修改它,word-splitting
的其余部分由修改后的IFS
完成,它不允许你的glob模式扩展。
您可以通过在本地将值传递给read
命令并且而不是全局修改它来避免它,这可以解决您的问题。
IFS='/' read -r -a array <<< "$entry"
IFS='.' read -r -a file <<< "$file_name"
IFS='-' read -r -a file_split <<< "${file[0]}"
一般来说,在循环glob
模式时,总是在处理文件之前检查文件是否存在,以避免出现难看的错误
for entry in "$WORKING_DIR"/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].doc
do
[ -e "$entry" ] || continue
# rest of the code following
(和)
双引号数组扩展如下,以避免再次拆分各个元素。如果不这样做,将导致数组的每个条目都按IFS
for WORKING_DIR in "${WORKING_DIRS[@]}"; do
答案 1 :(得分:0)
不确定为什么您的脚本不起作用但没有目录的示例内容,很难重现错误。无论如何,对于一个相当简单的任务来说,它看起来有点复杂。你可以简化,例如通过使用条件表达式的=~
运算符。例如:
for n in "$WORKING_DIR"/*.doc; do
if [[ $n =~ (.*\/)([0-9][0-9])(-[0-9][0-9]-)([0-9][0-9][0-9][0-9])\.doc ]]; then
mv $n ${BASH_REMATCH[1]}${BASH_REMATCH[4]}${BASH_REMATCH[3]}${BASH_REMATCH[2]}.doc
fi
done