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

;で20始まるすべてのファイルの名前を変更する必要があります。10つまり、名前をに変更B/2022222.1extする必要がありますB/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

ExplosionPillの答えに追加したいだけです。ただし、OS Xでは、次のように言う必要があります

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

または、mvコマンドがそれを認識しません。

于 2015-06-25T08:40:43.770 に答える
0

次のようなブレース拡張:

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

引用符で囲むことはできません。

代わりに、(Perlでrename)やってみてください:

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

プロンプトrenameからPerlツールを使用してこれを行うことができます。shell(これを実行できる場合とできない場合がある同じ名前の他のツールがあるので、注意してください。)

ドライランを実行してファイルを壊さないようにする場合は-n、コマンドにスイッチを追加します。

ノート

次のコマンドを実行した場合(linux

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

そしてあなたは次のような結果をもたらします

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

それならこれは正しいツールのようです=)

これはのデフォルトrenameコマンドのようですUbuntu

これをデフォルトにするにはDebian、次のような派生物を使用しUbuntuます。

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

のグロブの動作は*二重引用符で囲まれています。試す:

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