ディレクトリとサブディレクトリを正しく検索し、各サブディレクトリのすべてのアイコンを作成し、すでに存在するファイルを削除するにはどうすればよいですか。

ディレクトリとサブディレクトリを正しく検索し、各サブディレクトリのすべてのアイコンを作成し、すでに存在するファイルを削除するにはどうすればよいですか。

源泉

詳細

私のスクリプトは以下に基づいています。おじさん~の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配列にないコンテンツを減算して置き換える方法がわからないことを観察しましたscalablesymbolicyaru_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か。維持するにはどうすればよいですか?

ベストアンサー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

おすすめ記事