ディレクトリ内のすべてのPNGファイルの名前を繰り返し変更します。

ディレクトリ内のすべてのPNGファイルの名前を繰り返し変更します。

assets次のようなファイル構造を含むディレクトリがあります。

├── a
│   ├── b
│   │   ├── c.png
│   │   └── d.png
│   └── b2
│       ├── e.png
│       ├── f.png
│       └── g.png
└── a2
    └── b3
        └── h.png

この構造内のすべての画像の名前をNAME_old.pngファイルの元の名前を持つパターンにどのように変更できますか?NAME(たとえばにc.png変更c_old.png

sed/awk/grep とパイプの使用に関連しているようですが、そのツールの使い方を知らず、ドキュメントを読むことは実際には役に立ちません。

答え1

使用find

find assets -type d -exec sh -c '
    for n in "$1"/*.png; do
        test -f "$n" && mv "$n" "${n%.png}_old.png"
    done' sh {} ';'

このfindコマンドは以下を探します。目次ディレクトリ内または下にありますassets。見つかった各ディレクトリに対して、次の短いシェルスクリプトを実行します。

for n in "$1"/*.png; do
    test -f "$n" && mv "$n" "${n%.png}_old.png"
done

ここでは、$1見つかったディレクトリのパスに展開されます。スクリプトは*.pngディレクトリ内の一致するすべてのファイル名を繰り返し、.png変数置換を使用してファイル名のサフィックスを変更します。_old.png

これtest -fにより、既存のファイルで操作を実行できます。ディレクトリ容量いいえ一致するファイル*.png(たとえば、ディレクトリ)が含まれている場合assets、パターンは。aa2$n

またはより短く、

find assets -type f -name '*.png' \
    -exec sh -c 'for n; do mv "$n" "${n%.png}_old.png"; done' sh {} +

テスト:

$ mkdir -p assets/a{,2}/b{,2,3}
$ touch assets/a{,2}/b{,2,3}/{a,b,c,d}.png
$ tree
.
`-- assets
    |-- a
    |   |-- b
    |   |   |-- a.png
    |   |   |-- b.png
    |   |   |-- c.png
    |   |   `-- d.png
    |   |-- b2
    |   |   |-- a.png
    |   |   |-- b.png
    |   |   |-- c.png
    |   |   `-- d.png
    |   `-- b3
    |       |-- a.png
    |       |-- b.png
    |       |-- c.png
    |       `-- d.png
    `-- a2
        |-- b
        |   |-- a.png
        |   |-- b.png
        |   |-- c.png
        |   `-- d.png
        |-- b2
        |   |-- a.png
        |   |-- b.png
        |   |-- c.png
        |   `-- d.png
        `-- b3
            |-- a.png
            |-- b.png
            |-- c.png
            `-- d.png

9 directories, 24 files

(findここで実行されるコマンド)

$ tree
.
`-- assets
    |-- a
    |   |-- b
    |   |   |-- a_old.png
    |   |   |-- b_old.png
    |   |   |-- c_old.png
    |   |   `-- d_old.png
    |   |-- b2
    |   |   |-- a_old.png
    |   |   |-- b_old.png
    |   |   |-- c_old.png
    |   |   `-- d_old.png
    |   `-- b3
    |       |-- a_old.png
    |       |-- b_old.png
    |       |-- c_old.png
    |       `-- d_old.png
    `-- a2
        |-- b
        |   |-- a_old.png
        |   |-- b_old.png
        |   |-- c_old.png
        |   `-- d_old.png
        |-- b2
        |   |-- a_old.png
        |   |-- b_old.png
        |   |-- c_old.png
        |   `-- d_old.png
        `-- b3
            |-- a_old.png
            |-- b_old.png
            |-- c_old.png
            `-- d_old.png

9 directories, 24 files

答え2

使用find と命名:

find . -type f -name '*.png' -exec prename 's/\.png$/_old.png/' {} +

答え3

いいえfind

固定ディレクトリ構造が与えられたら、ディレクトリにワイルドカードを使用できます。

rename -n s/.png/_old.png/ */*/*.png

(実際にコマンドを実行する-nように変更します-v。)

PNGが異なるディレクトリレベルにある場合でも、これを回避できますfind

shopt -s globstar
rename -n s/.png/_old.png/ **/*.png

(ディレクトリレベルの数に関係なく設定するには、globstarsetを使用してください。)**

Debianとその派生製品ではと呼ばれますprenameが、rename同じコマンドです。

関連情報