我有一个文件夹结构如下的目录:
-- 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上使用命令行完成此任务有什么建议吗?
发布于 2012-09-13 04:11:55
您可以使用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)。这样做可以节省你在保存目录路径/ etc时的大量解析工作。
发布于 2012-09-13 04:15:35
您可以使用string manipulations和arrays来实现这一点。
类似于:
for f in * ; do
parts=(${f//-/ })
mv "$f" "20${parts[2]}_${parts[1]}_${parts[0]}"
done在此站点中搜索递归到目录的各种选项,例如:Shell script to traverse directories
发布于 2012-09-13 04:20:29
使用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
donehttps://stackoverflow.com/questions/12395481
复制相似问题