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
、パターンは。a
a2
$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
(ディレクトリレベルの数に関係なく設定するには、globstar
setを使用してください。)**
Debianとその派生製品ではと呼ばれますprename
が、rename
同じコマンドです。