1

私の現在のタスクは、複数のディレクトリにまたがる多数のファイルの名前を異なる識別子に変更することです。

したがって、b01、b02、b03 などのようないくつかのディレクトリがあります。各ディレクトリ内には、img01.23495.png、img01.3596596.png、img02.2399495.png などのファイル名があります。

b01 の img01 の名前を他の識別子に変更する必要があります。したがって、識別子はディレクトリ名とファイル名の最初の部分に依存します。

パイプラインに関する私の考えは次のとおりです。すべてのpngファイル名を取得し、それがどのフォルダーにあるかを抽出し、img##部分を抽出し、情報をファイルに保存するので、次のようなファイルを取得します:

b01 img01
b01 img02
b02 img01
...

これは便利なので、あとがきで新しい識別子を 3 列目に指定し、ファイルを読み込んで実際の名前変更を実行できます。

現在、./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

申し訳ありませんが、それについて完全なテストを行うことはできません-私は仕事中で、奇妙なsed問題があるOSXで立ち往生しています。とにかく、解決策の核心は ( -nametest forfind-uflag 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 に答える