我有一个文件夹结构的目录如下:
-- DATA -- ABD 1231345 -- 01-08-12 // date in mm-dd-yy format
-- 03-09-12
-- 06-11-12
-- DEF 4859480 -- 02-10-12
-- 05-10-12
-- 07-10-12
我想批量重命名此DATA
文件夹,如下所示
-- DATA -- ABD 1231345 -- 2012_01_08 // date in yyyy_mm_dd format with underscore
-- 2012_03_09
-- 2012_06_11
-- DEF 4859480 -- 2012_02_10
-- 2012_05_10
-- 2012_07_10
您是否有关于如何在Mac OSX / unix上使用命令行的建议?
答案 0 :(得分:2)
您可以使用for
循环和awk
,将每个文件名解析为指定格式,然后mv
将原始文件重命名为新名称:
for dir in DATA/*; do \
pushd "$dir"; # change directory \
for file in *; do \
path=`echo $file | awk -F- '{print "20"$3"_"$1"_"$2}'`; \
mv $file $path; # "rename" the file \
done; \
popd; # restore original directory \
done;
这可以在DATA
以上的文件夹中执行。如果您想直接在DATA
中执行,请将第一个循环更新为for dir in *; do
而不是DATA/*
。它告诉awk
使用-
作为分隔符(而不是空格),然后从" mm-dd-yy"重建字符串。到" 20yy_mm_dd"。
使用pushd
和popd
将使脚本能够将当前目录更改为DATA
(pushd
)内的每个子目录,然后在移动所有必需文件后将更改回到原来的(popd
)。这样做可以节省大量的解析工作,试图保存目录路径/等。
答案 1 :(得分:1)
您可以使用string manipulations和arrays来仅使用bash执行此操作。
类似的东西:
for f in * ; do
parts=(${f//-/ })
mv "$f" "20${parts[2]}_${parts[1]}_${parts[0]}"
done
在此网站搜索各种选项以递归到目录中,例如: Shell script to traverse directories
答案 2 :(得分:1)
使用date
命令转换文件名:
$ date -j -f %m-%d-%y 01-08-12 +%Y_%m_%d
2012_01_08
获取文件有点过时了。我们只需切换目录以避免处理长文件路径。
for d in DATA; do
pushd "$d"
for f in *; do
new_f=$(date -j -f %m-%d-%y $f +%Y_%m_%d)
mv "$f" "$new_f"
done
popd
done
答案 3 :(得分:0)
This site提供了一个很好的代码段
for i in *.avi; do j=`echo $i | sed 's/(\d{2})-(\d{2})-(\d{2})/20\3_\1_\2/g'`; mv "$i" "$j"; done