1

我当前的任务是将多个目录中的大量文件重命名为不同的标识符。

所以我有几个目录,如:b01、b02、b03 等。每个目录中都有文件名,如 img01.23495.png、img01.3596596.png、img02.2399495.png 等。

我必须将 b01 的 img01 重命名为其他标识符。所以标识符取决于目录名和文件名的第一部分。

我对管道的想法是:获取所有 png 文件名,提取它所在的文件夹,提取 img## 部分,并将信息存储到一个文件中,所以我会得到一个文件,如下所示:

b01 img01
b01 img02
b02 img01
...

这很有用,因此我可以在后记中指定新标识符作为第三列,然后读入文件以执行实际重命名。

目前,我有诸如 ./images/something/b01/img01.2342394.png 之类的路径。

要获取列表,我目前正在尝试类似 find . | grep png | something sed | sort | uniq > indentifiers.txt

然而,我被困在这sed部分。也欢迎任何关于我正在尝试做的事情的建议。

4

1 回答 1

2
find . -name "*.png" | sed 's#^.*/\([^/]*\)/\([^/.]*\)\.[0-9]\+\.png$#\1 \2#' | sort -u

抱歉,我无法对此进行全面测试 - 我正在工作并坚持使用 OSX,它有奇怪的sed问题。无论如何,解决方案的核心(除了使用-name测试 forfind-u标志 for sort)是 sed 正则表达式。你似乎有一个句柄,但我会解释整个事情,以防有人发现它:

s - Search and Replace
  # - Delimiter (Search pattern)
    ^ - Beginning of a line
    . - Any character
    * - zero or more times
    / - a literal '/'
    \( - start a capturing group
      [^/]* - Any character except '/', zero or more times
    \) - End capturing group (#1)
    / - a literal '/'
    \( - start a capturing group
      [^/.]* - Any character except '/' or '.', zero or more times
    \) - End capturing group (#2)
    \. - a literal '.'
    [0-9] - a digit
    \+ - one or more times
    \.png - a literal '.png'
    $ - end of the line
  # - Delimiter, now starting the replace pattern
    \1 - the contents of the first capturing group
       - a space
    \2 - the contents of the second capturing group
  # - Delimiter.  End of all patterns.
于 2013-05-06T17:15:38.133 回答