如何使用符号模式在bash中重命名多个目录

时间:2014-07-11 10:23:34

标签: bash directory find rename

我是bash的新手,所以请不要过于复杂化答案! 我有大约200个子目录,每个子目录都与此类似。 (我认为它们是子目录。它们至少存在于另一个目录中。)

XMMXCS J083454.8+553420.58

我需要批量重命名所有这些目录,并将目录名中的“+”更改为“ - ”。

要更改我尝试过的目录的名称:

find . -depth -type d -name + -exec sh -c 'mv "${0}" "${0%/+}/-"' {} \;

find . -name + -type d -execdir mv {} - \

但是我认为这不起作用,因为+和 - 不是字母字符。 我该如何解决这个问题? 我在网上发现的一切都与重命名文件而不是目录有关,如果有人知道如何绕过这个而不必手动重命名它们将非常感激。

我之前尝试的问题和语法对我不起作用。运行后,文件夹都被称为相同的东西。 Rename multiple directories matching pattern

由于

2 个答案:

答案 0 :(得分:0)

您可以拥有这样的脚本。

#!/bin/bash

DIR='.'  ## Change to the directory you want.

for SDIR in "$DIR"/*; do
    [[ -d $SDIR ]] || continue           ## Skip if it's not a directory
    BASE=${SDIR##*/}                     ## Gets the base filename (removes directory part)
    NEW_NAME=${BASE//+/-}                ## Creates a new name based from $BASE with + chars changed to -
    echo mv -- "$SDIR" "$DIR/$NEW_NAME"  ## Rename. Remove echo if you think it works the right way already.
done

然后运行bash script.sh

答案 1 :(得分:0)

您的原始语法非常接近,尝试类似这样的

find -mindepth 1 -maxdepth 1 -type d -name '*+*' -exec bash -c 'mv "${0}" "${0//+/-}"' {} \;

问题

  • -depth执行dfs遍历,但似乎只需要一级深度的目录
  • 您需要匹配包含+的全局。所以*+*而不只是+(使用globs需要引用,因此它们会被find而不是shell处理)
  • 使用"${0%/+}/-",您似乎混合了一些语法,${0//SUBSTRING/TO_REPLACE}SUBSTRING的所有实例替换为TO_REPLACE