我是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
由于
答案 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