검색결과가 최신이 아닙니다.

검색결과가 최신이 아닙니다.

내 문제: find 명령으로 반환된 결과가 "최신" 상태가 아닌 것 같습니다.

나는 다음과 같은 bash 스크립트를 가지고 있습니다.

  1. 디렉토리에서 gif 파일 목록을 얻습니다.
  2. png를 만들기 위해 (imagemagick에서) 변환을 사용합니다.
  3. 동일한 디렉터리에 있는 png 파일 목록을 얻습니다. (여기에 gif 파일이 있는 경우 이전에 생성된 파일이 포함되어 있을 수 있습니다.)
  4. optipng를 사용하여 최적화합니다.

이 스크립트를 그대로 두면 gif가 있을 때 해당 png를 찾을 수 없습니다. 키보드로 읽어서 스크립트를 강제로 일시 중지하면 새 png가 발견됩니다.

내 설명:

  • 변환이 즉시 반환되므로 gif를 png 파일로 만들기 전에 find png가 실행됩니다. 이 경우 다음 명령을 강제로 기다리는 방법은 무엇입니까?
  • 또는 find 명령은 업데이트하는 데 시간이 걸리는 일부 시스템 기능을 사용합니다. 이 경우 디렉터리 정보를 강제로 업데이트하려면 어떻게 해야 합니까?

감사해요

답변1

네 가지 단계를 따릅니다("목록 가져오기..." 단계는 필요하지 않으므로 무시).

#!/bin/bash

topdir=some/directory/path

find "$topdir" -type f -name '*.gif' -exec sh -c '
    for gifpath do
        convert "$gifpath" "${gifpath%.gif}.png"
    done' sh {} +

find "$topdir" -type f -name '*.png' -exec optipng {} \;

먼저 .gif이름이 다음 또는 아래로 끝나는 모든 일반 파일을 찾아 $topdirPNG 이미지로 변환합니다.

그런 다음 모든 PNG 이미지를 동일한 방식으로 찾아 optipng각 이미지에서 실행합니다(저는 이 명령에 대해 아무것도 모르므로 여기서는 추측일 뿐입니다). 두 번째는 find스크립트를 실행하기 전에 존재했을 수 있는 PNG 이미지도 찾습니다.

새로 생성된 PNG 이미지에서만 실행 하려면 optipng다음을 사용하세요 find.

find "$topdir" -type f -name '*.gif' -exec sh -c '
    for gifpath do
        pngpath=${gifpath%.gif}.png
        convert "$gifpath" "$pngpath"
        optipng "$pngpath"
    done' sh {} +

관련된:"find"의 -exec 옵션 이해

또는 **in을 사용하여 bash재귀적으로 일치시킵니다 $topdir.

#!/bin/bash

topdir=some/directory/path

shopt -s globstar nullglob dotglob

for gifpath in "$topdir"/**/*.gif; do
    if [ -f "$gifpath" ]; then
        pngpath=${gifpath%.gif}.png
        convert "$gifpath" "$pngpath"
        optipng "$pngpath"
    fi
done

위의 각 코드 조각에서 optipng명령은 명령이 완료될 때까지 실행되지 않습니다 convert. 그래도 설명하신 성격과 동일한 문제가 발생한다면(이후에는 PNG 이미지를 사용할 수 없음 convert) 문제가 무엇인지 설명하는 오류 메시지를 찾아보겠습니다.

답변2

누군가가 시스템이 모든 캐시를 플러시하고 완료되지 않은 디스크 트랜잭션을 방지하도록 하는 sync 명령을 권장했습니다.

그런데 이 이상한 버그가 사라졌습니다. 내 생각에는 내 부분의 구문 문제가 발견되지 않았습니다. 그래도 도움을 주셔서 감사합니다. 현재 상황은 다음과 같습니다.

#!/bin/bash

clear

mapfile -t tab < <(jq -r '.[] | .' img_folders_to_optimize.json)
printf '%s\n' "${tab[@]}" | while read -r folder; do
  echo "dossier à traiter : $folder"
  cd "$folder" || exit

  # GIF
  for filepath in *.gif; do
    echo "GIF : $filepath"
    nb_frames=$(identify -format %n "$filepath")
    if [ "$nb_frames" != 1 ]; then
      echo "animated"
    else
      echo "convert to png"
      filepath_png=${filepath/\.gif/.png}
      convert "$filepath" "$filepath_png" &>/dev/null
      echo "converted"
    fi
  done

  # PNG
  for filepath in *.png; do
    echo "PNG : $filepath"
    echo "optimize"
    optipng -o7 -strip all "$filepath" &>/dev/null
    echo "convert lossless to webp"
    filepath_webp=${filepath/\.png/.webp}
    cwebp -lossless "$filepath" -o "$filepath_webp" &>/dev/null
  done

  # JPG
  for filepath in *.jpg; do
    echo "JPG : $filepath"
    echo "optimize"
    mogrify -quality 70 "$filepath"
    echo "convert lossy to webp"
    filepath_webp=${filepath/\.jpg/.webp}
    cwebp -q 50 -m 4 -mt "$filepath" -o "$filepath_webp"
  done

  echo "dossier traité"
done

관련 정보