디렉터리와 하위 디렉터리를 올바르게 찾고 각 하위 디렉터리에 대한 모든 아이콘을 생성한 다음 이미 존재하는 파일을 삭제하려면 어떻게 해야 합니까?

디렉터리와 하위 디렉터리를 올바르게 찾고 각 하위 디렉터리에 대한 모든 아이콘을 생성한 다음 이미 존재하는 파일을 삭제하려면 어떻게 해야 합니까?

원천

세부 사항

내 스크립트는 다음을 기반으로합니다.@btd1337~의urart 아이콘 스크립트타사 아이콘만 유지되지만 이 스크립트는 다음과 같은 이유로 내 아이콘 테마 프로젝트와 호환되지 않습니다.

  • 야루++그리고 규범적인야루다양한 계층/트리가 있습니다.
  • Yaru++는 SVG 형식을 사용하고 Yaru는 PNG 형식을 사용합니다.

그래서 Shell Script로 스크립트를 다시 작성하고 원래 Yaru 디렉터리와 하위 디렉터리를 찾아 각 하위 디렉터리의 모든 아이콘을 텍스트 파일로 출력하고 Yaru++ 폴더에 들어가서 텍스트 파일을 나열하여 기존 파일을 삭제하고 타사만 유지합니다. 아이콘입니다. 세부정보 마지막 부분에 분석할 수 있도록 zip 파일도 포함했습니다.

Yaru++ 및 Yaru 샘플과 작은 나무를 따르세요.

  • 야루의 나무++:

    Yaru++
    ├── actions
    │   ├── 16
    │   │   ├── button_cancel.svg
    │   │   └── window-close.svg
    │   ├── 48
    │   │   ├── button_cancel.svg
    │   │   └── window-close.svg
    │   ├── scalable
    │   │   ├── button_cancel.svg
    │   │   └── window-close.svg
    │   └── symbolic
    │       ├── button_cancel-symbolic.svg
    │       └── window-close-symbolic.svg
    └── apps
        ├── 16
        │   ├── office.svg
        │   └── x-office-address-book.svg
        ├── scalable
        │   ├── office.svg
        │   └── x-office-address-book.svg
        └── symbolic
            ├── office-symbolic.svg
            └── x-office-address-book-symbolic.svg
    
  • 오리지널 야루나무:

    Yaru
    ├── 16x16
    │   ├── actions
    │   │   ├── button_cancel.png
    │   │   └── window-close.png
    │   └── apps
    │       ├── office.png
    │       └── x-office-address-book.png
    ├── 48x48
    │   ├── actions
    │   │   ├── button_cancel.png
    │   │   └── window-close.png
    │   └── apps
    │       ├── office.png
    │       └── x-office-address-book.png
    └── scalable
        ├── actions
        │   ├── button_cancel-symbolic.svg
        │   └── window-close.svg
        └── apps
            ├── officer-symbolic.svg
            └── x-office-address-book-symbolic.svg
    

또한 몇 가지 작은 세부 사항에도 주의를 기울이십시오.

  • 원래 Yaru에서는 크기가 폴더이고 디렉터리가 하위 폴더였습니다.
  • Yaru++에서 디렉터리는 폴더이고 크기는 하위 폴더입니다.
  • 원본 Yaru는 아이콘에 접미사가 있다는 점에서 scalable/[directories]Yaru++와 동일합니다 .[directories]/symbolic-symbolic

이제 쉘 스크립트에서 스크립트의 다양한 부분을 보여드리겠습니다.

directoriesYaru와 Yaru++에서도 상황이 동일하다는 점을 확인하세요 . 크기는 다양합니다.

yaru_original="/usr/share/icons/Yaru"
declare -a yaru_original_sizes=(16x16 24x24 32x32 48x48 scalable)

yaru_plus="$HOME/GitHub/yaru-plus/Yaru++"
declare -a yaru_plus_sizes=(16 24 32 48 symbolic)

declare -a directories=(actions apps categories devices emblems mimetypes places status)

home="$(pwd)" # folder /script

다음 부분에서는 원본 Yaru, 해당 폴더( size) 및 하위 폴더( directory)를 찾아 다음 위치에 저장합니다 fileList.

echo "PHASE 1 – Locate the directories of original Yaru"

function main() 
{
  cd $yaru_original
  for size in "${yaru_original_sizes[@]}"
  do
      for directory in "${directories[@]}"
      do
          fileList $size $directory
      done
  done
  cd $home
}

pwd그런 다음 원래 폴더 위치 로 돌아갑니다 script.

다음과 같이 출력되어야 합니다.

# $yaru_original/$size/directory
/usr/share/icons/Yaru/16x16/actions
/usr/share/icons/Yaru/16x16/apps
/usr/share/icons/Yaru/24x24/actions
/usr/share/icons/Yaru/24x24/apps
/usr/share/icons/Yaru/32x32/actions
/usr/share/icons/Yaru/32x32/apps
/usr/share/icons/Yaru/48x48/actions
/usr/share/icons/Yaru/48x48/apps
/usr/share/icons/Yaru/scalable/actions
/usr/share/icons/Yaru/scalable/apps
# ...

그런 다음 함수는 fileList함수 내에 하위 디렉터리를 저장 main하고 각 하위 디렉터리에 대한 확장 없이 모든 아이콘의 출력을 생성합니다(Yaru는 PNG 형식을 사용하고 Yaru++는 SVG 형식을 사용하기 때문).

echo "PHASE 2 – Generate output files without extension"

function fileList() 
{
    local directory=$1
    local size=$2
    local search_file=($(find $yaru_original/$size/$directory/))
    if [ $search_file ]
    then
        for entry in "${search_file[@]}"
        do
          for i in *; do echo "${i%.png}"; done > $home/$directory-$size.txt
        done
    fi
}

다음과 같이 출력되어야 합니다.

# $home/$directory-$size.txt
/home/gus/script/actions-16x16.txt
/home/gus/script/apps-16x16.txt
/home/gus/script/actions-24x24.txt
/home/gus/script/apps-24x24.txt
/home/gus/script/actions-32x32.txt
/home/gus/script/apps-32x32.txt
/home/gus/script/actions-48x48.txt
/home/gus/script/apps-48x48.txt
/home/gus/script/actions-scalable.txt
/home/gus/script/apps-scalable.txt

x{size}원래 Yaru 배열에 없는 콘텐츠를 빼고 바꾸는 방법을 모른다는 사실을 관찰했습니다 scalable.symbolicyaru_original_sizes

파일에서 actions-16x16.txt:

button_cancel
window-close

이제 최종 수집에서는 awk확장자를 사용하여 인쇄하는 텍스트 파일을 읽고 .svgYaru++에서 Yaru에 이미 존재하는 파일을 제거합니다.

echo "PHASE 3 – Remove the files that already exist in Canonical's original Yaru"

function removeList()
{
  cd $yaru_plus
  for directory in "${directories[@]}"
  do
      for size in "${yaru_plus_sizes[@]}"
      do
          rm $(awk '{ print $0".svg" }' $home/$size-$directory.txt)
      done
  done
}

main

출력 awk '{ print $0".svg" }' $home/$size-$directory.txt:

# awk '{ print $0".svg" }' /home/gus/script/actions-16x16.txt
button_cancel.svg
window-close.svg

출력 rm $(awk '{ print $0".svg" }' $home/$size-$directory.txt):

rm /home/gus/GitHub/yaru-plus/Yaru++/actions/16/button_cancel.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/actions/16/window-close.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/actions/48/button_cancel.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/actions/48/window-close.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/actions/symbolic/button_cancel-symbolic.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/actions/symbolic/window-close-symbolic.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/apps/16/office.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/apps/16/x-office-address-book.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/apps/48/office.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/apps/48/x-office-address-book.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/apps/symbolic/office-symbolic.svg
rm /home/gus/GitHub/yaru-plus/Yaru++/apps/symbolic/x-office-address-book-symbolic.svg

분석을 위해 작은 압축 폴더를 제공하겠습니다.https://github.com/Bondry/yaru-plus/files/5013472/UnixStackExchange.zip

결과

오류 출력으로 인해 스크립트가 실패했습니다.

find: ‘/usr/share/icons/Yaru/16x16/128x128/’: No file or folder
find: ‘/usr/share/icons/Yaru/24x24/128x128/’: No file or folder
find: ‘/usr/share/icons/Yaru/32x32/128x128/’: No file or folder
find: ‘/usr/share/icons/Yaru/48x48/128x128/’: No file or folder

내 스크립트가 작동하지 않고 내 코드가 올바른 것 같지 않습니다. 함수와 조건을 사용하여 for디렉터리와 하위 디렉터리를 올바르게 찾고 저장 fileList하려면 어떻게 해야 하며, fileList각 하위 디렉터리에 대한 모든 아이콘이 포함된 파일 출력을 올바르게 생성한 다음 Yaru++에서 Yaru에 이미 존재하는 파일을 제거하고 타사 아이콘만 유지하려면 어떻게 해야 합니까?

답변1

작동해야 하는 간단한 버전은 다음과 같습니다.

#! /bin/bash

yaru_original="/UnixStackExchange/usr/share/icons/Yaru"
yaru_plus="/UnixStackExchange/home/gus/GitHub/Yaru++"

# map the Yaru sizes to Yaru++ sizes
declare -A size_mapping=([16x16]=16 [24x24]=24 [32x32]=32 [48x48]=48 [scalable]=symbolic)
declare -a directories=(actions apps categories devices emblems mimetypes places status)

for size in "${!size_mapping[@]}"
do
    for dir in "${directories[@]}"
    do
        for i in "$yaru_original/$size/$dir/"*.{png,svg}
        do
            # Take just the filename ${i##*/} and build the new path
            plus_file=$yaru_plus/$dir/${size_mapping["$size"]}/${i##*/}
            if [[ $plus_file = *.png ]]
            then
                # replce the extension with svg
                plus_file=${plus_file%.png}.svg
            fi
            [[ -f "$plus_file" ]] && echo rm "$plus_file"
        done
    done
done

주어진 예에서는 50개 파일 중 13개가 삭제 대상으로 감지되었습니다.

# bash foo.sh
rm /UnixStackExchange/home/gus/GitHub/Yaru++/actions/16/window-close.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/16/office.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/16/x-office-address-book.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/actions/48/window-close.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/48/office.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/48/x-office-address-book.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/actions/symbolic/button-close-symbolic.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/actions/symbolic/window-close-symbolic.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/symbolic/office-symbolic.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/symbolic/x-office-address-book-symbolic.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/actions/24/window-close.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/24/office.svg
rm /UnixStackExchange/home/gus/GitHub/Yaru++/apps/24/x-office-address-book.svg

echo파일을 삭제 하지 않고 스크립트를 실행합니다 . 어쩌면 rm -i대신 사용할 수도 있습니다 echo rm.

관련 정보