0

我有一个文件夹结构如下的目录:

-- 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 上使用命令行有什么建议吗?

4

4 回答 4

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,请将第一个循环更新为 readfor dir in *; do而不是DATA/*. 它告诉awk使用-作为分隔符(而不是空格),然后将字符串从“mm-dd-yy”重构为“20yy_mm_dd”。

使用pushdandpopd将使脚本能够将当前目录更改为DATA( pushd) 内的每个子目录,然后,在移动所有必要的文件后,将更改回原始目录 ( popd)。这样做将为您节省大量尝试保存目录路径 / 等的解析工作。

于 2012-09-12T20:11:55.063 回答
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
于 2012-09-12T20:20:28.580 回答
1

您可以使用字符串操作数组来仅使用 bash 来执行此操作。

就像是:

for f in * ; do
  parts=(${f//-/ })
  mv "$f" "20${parts[2]}_${parts[1]}_${parts[0]}"
done

在此站点中搜索各种选项以递归到目录中,例如: Shell 脚本遍历目录

于 2012-09-12T20:15:35.090 回答
0

这个网站提供了一个很好的片段

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
于 2012-09-12T20:15:07.213 回答