디렉터리에 있는 모든 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(예: assetsa디렉터리 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

( 디렉터리 수준 수에 관계없이 설정하려면 globstarset을 사용하세요.)**

Debian 및 그 파생 제품에서는 prename라고 불리지 rename만 동일한 명령입니다.

관련 정보