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
만 동일한 명령입니다.