원천
- .txt 파일의 각 줄에 접두사 및 접미사 추가
- 'ls -1' : 확장자 없이 파일 이름을 나열하는 방법
- 모든 디렉터리 및 하위 디렉터리에서 모든 파일, 크기 및 파일 경로를 가져오는 Linux 명령
- 특정 폴더의 파일 및 하위 디렉터리 삭제
- 텍스트 파일에 디렉터리 이름이 포함되도록 각 하위 디렉터리에 텍스트 파일을 만드는 방법
세부 사항
내 스크립트는 다음을 기반으로합니다.@btd1337~의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
각 하위 디렉터리에 대한 모든 아이콘이 포함된 파일 출력을 올바르게 생성한 다음 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
.