Unix CLI脚本,使用其预先存在的名称重命名文件夹

时间:2012-09-12 20:05:01

标签: regex bash unix rename

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

-- 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 个答案:

答案 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"。

使用pushdpopd将使脚本能够将当前目录更改为DATApushd)内的每个子目录,然后在移动所有必需文件后将更改回到原来的(popd)。这样做可以节省大量的解析工作,试图保存目录路径/等。

答案 1 :(得分:1)

您可以使用string manipulationsarrays来仅使用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