我在/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
答案 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
}
请注意,这假设不同目录中的文件是不同的。