文件名更改脚本在第二轮循环中不起作用

时间:2017-08-08 06:03:02

标签: bash

此代码用于搜索包含名称格式为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

2 个答案:

答案 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