【问题标题】:Unix CLI script to rename folders containing space用于重命名包含空格的文件夹的 Unix CLI 脚本
【发布时间】:2012-09-07 20:12:48
【问题描述】:

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

DATA -- ABD 1231345 -- 2012_01_08
                    -- 2012_03_09
                    -- 2012_06_11

     -- DEF 4859480 -- 2012_02_10
                    -- 2012_05_10
                    -- 2012_07_10

我想做的是:

  • cd DATA
  • 运行一个 bash 脚本(在 /DATA 中),它将从以下位置重命名所有第一个子文件夹

ABD 1231345

ABD_1231345

您对如何在 Mac OSX / unix 上使用命令行完成有什么建议吗?

【问题讨论】:

    标签: regex bash unix rename


    【解决方案1】:
    for i in *; do mv "$i" "${i// /_}"; done
    

    请注意,${i//string/repl} 语法是 sh 的非标准扩展,但您可以通过以下方式可移植地做同样的事情:

    for i in *; do j=$( echo "$i" | tr ' ' _); mv "$i" "$j"; done
    

    【讨论】:

    • william 这会递归地深入文件夹结构吗?我只是注意到这是必要的
    • 这不会递归。最好的办法可能是执行find . -exec rename_file {} \; 之类的操作,其中 rename_file 是一个重命名文件的简单脚本(或者,如果您的 shell 支持导出 find 将识别的函数,则为一个函数)。
    • 你的脚本可以替换rename_file吗?
    • @thor rename_file 会简单得多。比如:new_name=${1// /_}; mv $1 $new_name;
    【解决方案2】:

    当前目录包含:

    aa 111
    bb 222
    aaa.txt
    aaa 1111.txt
    bbb 2222.txt
    

    输出:

    aa_111
    bb_222
    aaa.txt
    aaa 1111.txt
    bbb 2222.txt
    

    代码:

    ls -ltr|awk -F" " '{print $9,$10}'|sed 's/ $//g'|grep -v "^$">abc
    
    while read line
    do
    val=`echo $line`
    echo $line|grep " ">/dev/null
    rc=$?
    if [[ -d "$val" && $rc -eq 0 ]]
    then
    replace=`echo $line|sed 's/ /_/g'`
    mv "$val" "$replace"
    fi
    done<abc
    
    rm -f abc
    

    这里,上面的脚本只是重命名当前目录中的文件夹。你可以跳过grep部分(为了效率)。

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2011-11-20
      • 2014-12-27
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2011-12-25
      相关资源
      最近更新 更多