批量重命名目录以匹配子目录中文件的名称

时间:2014-03-24 16:54:11

标签: bash shell directory directory-structure batch-rename

我在/home/environment中有许多目录,以不同的时间和日期标记命名。我想重命名所有这些目录,以便每个目录都包含作为shell脚本一部分的.txt文件的名称,而不是时间日期戳。 E.g。

之前

/home/environment/2014-03-12-09-49-26/xxxx-A.2A1-xxxx-0x_B.txt
/home/environment/2014-03-12-09-50-34/xxxx-C.D57-xxxx-4x_E.txt

/home/environment/xxxx-A.2A1-xxxx-0x_B/xxxx-A.2A1-xxxx-0x_B.txt
/home/environment/xxxx-C.D57-xxxx-4x_E/xxxx-C.D57-xxxx-4x_E.txt

1 个答案:

答案 0 :(得分:0)

我对问题Better way to rename files based on multiple patterns的回答描述了您可以在这里找到的一般模式:

 job_select /path/to/directory| job_strategy | job_process

其中job_select负责选择作业对象,job_strategy为这些对象准备处理计划,job_process最终执行计划。有关此模式的一般性讨论,请参阅上一个问题,我只会在此处写下一个实现。

这假设文件名不包含竖线|或换行符。

job_select功能

 # job_select PATH
 #  Produce the list of files to process
 job_select()
 {
   find "$1" -type f -name '*.txt'
 }

job_strategy功能

# job_strategy
#  Prepare a plan for renaming directories
job_strategy()
{
  sed -e 's@/\([^/]*\)/\([^/]*\)\.txt$@|\1|\2@'
}

job_process功能

# job_process
#  Rename directories according to a plan
job_process()
{
   local radical oldname newname
   while IFS='|' read radical oldname newname; do
     mv "$radical/$oldname" "$radical/$newname"
   done
}

请注意,这假设不同目录中的文件是不同的。