12

我有一个看起来像这样的文件结构:

A/
    2098765.1ext
    2098765.2ext
    2098765.3ext
    2098765.4ext
      12345.1ext
      12345.2ext
      12345.3ext
      12345.4ext

B/
    2056789.1ext
    2056789.2ext
    2056789.3ext
    2056789.4ext
      54321.1ext
      54321.2ext
      54321.3ext
      54321.4ext

我需要重命名所有2010;开头的文件。即,我需要重命名B/2022222.1extB/1022222.1ext

我已经看到了许多有关重命名多个文件的其他问题,但似乎无法使其适用于我的情况。只是想看看我是否能在我实际尝试进行复制/重命名之前弄清楚我在做什么:

for file in "*/20?????.*"; do
    echo "{$file/20/10}";
done

但我得到的只是

{*/20?????.*/20/10}

有人可以告诉我如何做到这一点吗?

4

5 回答 5

22

你只是有一点不正确的语法就是:

for file in */20?????.*; do mv $file ${file/20/10}; done
  1. 从参数中删除引号in。否则,不会发生文件名扩展。
  2. 替换中的$应该放在括号之前
于 2013-02-13T17:33:00.667 回答
11

这是使用find命令的解决方案:

find . -name '20*' | while read oldname; do echo mv "$oldname" "${oldname/20/10}"; done

该命令实际上并不执行您的命令,它仅打印出应该执行的操作。查看输出,如果您满意,请删除该echo命令并真正运行它。

于 2013-02-13T17:40:17.173 回答
1

只是想添加到爆炸丸的答案。但是在 OS X 上,你必须说

mv "${file}" "${file_expression}"

或者mv命令无法识别它。

于 2015-06-25T08:40:43.770 回答
0

大括号扩展如:

{*/20?????.*/20/10}

不能被引号包围。

相反,尝试做(使用 Perl rename):

rename 's/^10/^20/' */*.ext 

您可以renameshell提示符下使用 Perl 工具执行此操作。(还有其他同名的工具可能会也可能不会这样做,所以要小心。)

如果您想进行试运行以确保不会破坏任何文件,请将-n开关添加到命令中。

笔记

如果您运行以下命令 ( linux)

$ file $(readlink -f $(type -p rename))

你有一个像

.../rename: Perl script, ASCII text executable

那么这似乎是正确的工具=)

这似乎renameUbuntu.

使其成为默认值Debian和派生值,例如Ubuntu

sudo update-alternatives --set rename /path/to/rename
于 2013-02-13T17:29:06.007 回答
-1

的 glob 行为*在双引号中被抑制。尝试:

for file in */20?????.*; do
    echo "${file/20/10}";
done
于 2013-02-13T17:31:26.630 回答