폴더, 하위 폴더 및 여러 파일에서 반복적으로 찾기 및 이름 바꾸기

폴더, 하위 폴더 및 여러 파일에서 반복적으로 찾기 및 이름 바꾸기

저는 쉘스크립트를 처음 사용하는데 필요한 작업을 수행하는 데 몇 가지 문제가 있습니다.

내 모든 *.png 이미지를 '최적화'하고 싶고 찾았습니다.이것그래서 나는 다음과 같이 bash를 만들었습니다.

#!/bin/bash    
 pngnq -vf -s1 *.png    
 rename -nq8.png .png *-nq8*     
 optipng -o7 *.png

이것이 하는 일은:

  • pngnq -vf -s1 *.pngImage.png 예제의 *png를 가져와서 최적화된 Image-nq8.png라는 이름의 복사본을 생성합니다.
  • rename -nq8.png .png *-nq8*Image-nq8.png를 Image.png로 만들어 이전과 동일하지만 최적화합니다(그래서 최적화하기 전과 동일한 폴더를 가질 수 있습니다) <= 매우 중요합니다!
  • optipng -o7 *.png복사본을 만들지 않고 Images.png에 또 다른 최적화를 수행합니다.

하지만 이제 문제가 생겼습니다.

콘솔에 모든 줄을 순서대로 쓰면 현재 폴더에서는 제대로 작동하지만 이제는 자동으로 재귀적으로 수행해야 합니다. 나는 내 사건을 설명합니다:

참고: 저는 폴더를 디렉토리라고 말합니다.

ImagesFolder라는 폴더가 있고 그 안에 *.png가 더 많은 다른 폴더가 있고 ImagesFolder의 모든 하위 폴더에서 이 bash를 실행하고 싶지만 어떻게 해야 할지 모르겠습니다. 쉘스크립트 등) 그리고 제가 인터넷에서 찾아 시도한 것은 작동하지 않거나 완전히 엉망이었습니다...

내가 가진 것을 더 잘 이해하려면 다음과 같습니다.

ImagesFolder
  |-Folder1
  |     |- Folder12
  |     |      |-20 images here
  |     |- Folder13
  |     |      |- 10 images more here
  |     |-  _Folder <- I have some folder names that start with '_'
  |     |- 5 images here 
  |-more images and folders and subfoldrs

이것이 구조이며 스크립트가 ImagesFolder에서 실행되기를 원합니다.

나는 for와 find를 사용해 보았고, 스크립트를 호출하는 콘솔에서 find를 사용해 보았습니다. 여기 스택에서 찾은 몇 가지 예제를 너무 적용해 보았지만 아무 것도 없었습니다... 아마도 실제로 어떻게 되는지 모르기 때문일 것입니다. 이 작품은 그렇게 적용할 수가 없어요. 이 문제를 해결하는 데 도움이 되길 바랍니다.

매우 감사합니다!

편집: 스크립트를 실행하려면 ImageFolder로 이동하여 콘솔을 열고 chmod u+x name_of_my_script하위 폴더로 실행하는 데 문제가 될 수 있습니까? 그렇다면 문제를 해결하는 방법을 알려주실 수 있나요?

답변1

Bash 스크립트:

새 파일을 만들고 find_and_rename다음 줄을 추가합니다.

  • 버전replace

    #!/bin/bash
    shopt -s globstar
    for f in **/*png; do 
        pngnq -vf -s1 "$f"
    
        # Uncomment the line below for a test run
        # rename -v -n 's/^(.*)\-nq8(.*)/$1$2/' "$f"
    
        # Comment the line below out for a test run
        rename -v 's/^(.*)\-nq8(.*)/$1$2/' "$f"
    
        optipng -o7 "$f"
    done
    
  • 버전mv

    #!/bin/bash
    shopt -s globstar
    for f in **/*png; do 
        pngnq -vf -s1 "$f"
    
        # Uncomment the line below for a test run
        # echo "$f  => ${f//-nq8/}"
    
        # Comment the line below out for a test run
        mv "$f" "${f//-nq8/}"
    
        optipng -o7 "$f"
    done
    

다음을 사용하여 파일을 실행 가능하게 만듭니다.

chmod +x find_and_rename

폴더로 이동합니다 ImagesFolder.

이 폴더의 스크립트를 시작하십시오.

<path_to_script>/find_and_rename

예( pngnq및 없음optipng

$ find . -type f -name "*.png"
./Image-nq8.png
./sub/Image-nq8.png
./Image2-nq8.png

$ ./find_and_rename 
Image2-nq8.png renamed as Image2.png
Image-nq8.png renamed as Image.png
sub/Image-nq8.png renamed as sub/Image.png

$ find . -type f -name "*.png"
./Image2.png
./sub/Image.png
./Image.png

관련 정보