
源泉
- .txt ファイルの各行にプレフィックスとサフィックスを追加する
- 'ls -1':拡張子なしでファイル名を一覧表示する方法
- すべてのディレクトリとサブディレクトリからすべてのファイル、サイズ、ファイルパスを取得するLinuxコマンド
- 特定のフォルダのファイルとサブディレクトリの削除
- テキストファイルにディレクトリ名が含まれるように、各サブディレクトリにテキストファイルを作成する方法
詳細
私のスクリプトは以下に基づいています。おじさん~のurart アイコンスクリプトサードパーティのアイコンだけが保持されますが、このスクリプトは次の理由で私のアイコンテーマプロジェクトと互換性がありません。
そのため、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
それでは、シェルスクリプトでスクリプトのさまざまな部分を紹介します。
directories
Yaruと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
。symbolic
yaru_original_sizes
ファイルからactions-16x16.txt
:
button_cancel
window-close
最後のコレクションでは、awk
拡張子を使用して印刷するテキストファイルを読み取り、.svg
Yaru ++から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
。