请原谅我,我是个 shell 菜鸟。我需要重命名很多目录,通常会使用 GUI 实用程序来执行此操作,但我的服务器访问是通过两个 VPN 上的 SMB 进行的,有数万个文件,在一个小子文件夹中尝试使用 GUI 实用程序需要几个小时...所以我使用 SSH,因为它的速度快了几个数量级。
我用 CD 转到一个目录,该目录的子文件夹包含我需要重命名的所有目录,我们将其称为 Direct1。我需要重命名的目录,我们将其称为 RenameDirect
它看起来像这样:
/Direct1/[任意目录]/SXS/[重命名直接]/[任意目录和文件]
我需要重命名(RenameDirect)的每个目录都是这样的:
[任意文本][六位数字][一个或两个空格][4 位数字年份 > 2000][任意文本]
我需要找到“一个或两个空格”位置上有两个空格的文件,然后将它们全部改为一个空格。两个空格都是错误的。其余任意文本中会有一些文件包含双空格,需要保留,所以我不能直接替换所有双空格。
以下是我的想法:
(IFS=$'\n'
find . -maxdepth 3 -type d -regextype sed -regex '.*/SXS/.*[0-9]\{6\} 20' | while read f; do
mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's,\([0-9]\) \(2\),\1 \2,')"
done)
通过在示例文件夹上进行测试,我非常确定“while”、“mv”和“sed”都正常工作。失败的是“find”的正则表达式参数。
任何帮助,将不胜感激,
谢谢。
答案1
好吧,我很惭愧自己发了帖子,因为我意识到了这个错误。在“查找”正则表达式中忘记了最后一个“.*”,以便在年份的前两位数字“20”之后继续匹配
工作版本为:
(IFS=$'\n'
find . -maxdepth 3 -type d -regextype sed -regex '.*/SXS/.*[0-9]\{6\} 20.*' | while read f; do
mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's,\([0-9]\) \(2\),\1 \2,')"
done)