Programowanie > Bash, skrypty powłoki
Bash - skrypt pętla for, if i foldery
(1/1)
bercikrk:
Cześć Wszystkim
Mam problem z ogarnięciem porównania nazw folderów i wykonania od[powiednich komend
W moim lunuxie jest folder /var/chroot gdzie mam 300 folderwów 4 znakowych (tylko duże litery) oraz ok 30 z nazwą 2 częściową
ABCD
ABDC
DCBA
BCDA
ACDB
nazwa_cos1
nazwa_cos2
nazwa_cos3
próbóję wykonać taki skrypt
for dir in `find /var/chroot/ -mindepth 1 -maxdepth 1 -type d`
do
if [ $dir = /var/chroot/nazwa_* ]; then
continue
#pomijam ten folder przy operacjach i przechodzę dalej
else
cd $dir
zip -r 202101.zip *.csv
rm -f *202101.csv
fi
done
skrypt ma znaleźć folder nazwa_cos i pominąć w wykonywaniu operacji, ale dla pozostałych ma wykonać polecenia. Min takie jak powyżej
problem jest w argumentach if [ $dir = /var/chroot/nazwa_* ]; then nie umie znaleźć to czego chcę i mimo wszystko wykonuje polecenia
Jak pokazać, że dla tych folderów nie ma nic wykonywać a przede wszystkim je znaleźć bo tych dwóch elementów nie umiem opanować w tym skrypcie.
próbowałęm takich ustawień if [ -d ], wstawić zmienne dir=`find /var/chroot/ -mindepth 1 -maxdepth 1 -type d` i dir1=find /var/chroot/ -mindepth 1 -maxdepth 1 -type d -name "*nazwa_*"
dla większości przypadkó mam info zbyt dużo argumentów
Proszę o instrukcję, wskazówki, pomoc jak to wykonać
Z góry dziękuję
Pozdrawiam
Bercik
1709:
1. BBCode
[ code ]
jakis kod
[ /code ]
--- Cytuj ---Jeśli zachodzi potrzeba wstawienia do postu kawałka kodu lub cokolwiek, co wymaga stałej szerokości znaków, należy użyć znacznik [ code ][ /code ] (bez spacji). Przykład: [ code ] echo "Oto jakiś kod"; [ /code ]. Żadne znaki formatowania użyte między znacznikami [ code ] i [ /code ] nie będą przetwarzane podczas wyświetlania i zostaną wyświetlone w oryginalnej formie.
--- Koniec cytatu ---
https://mozillapl.org/forum/faq.php?mode=bbcode
-------------------------------------------------------------------------------------------------
2. Bash Conditional Expressions
--- Cytuj ---6.4 Bash Conditional Expressions
Conditional expressions are used by the [[ compound command and the test
and [ builtin commands.
--- Koniec cytatu ---
--- Cytuj ---string1 == string2
string1 = string2
True if the strings are equal. When used with the [[ command, this performs pattern matching as described above (see Conditional Constructs).
‘=’ should be used with the test command for POSIX conformance.
--- Koniec cytatu ---
https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
--- Kod: ---
$ for dir in `find /var/ -mindepth 1 -maxdepth 1 -type d` ; do echo $dir ; if [[ "$dir" = "/var/lo"* ]] ; then echo gooooooool ; break ; fi ; done
/var/crash
/var/games
/var/lib
/var/log
gooooooool
--- Koniec kodu ---
https://stackoverflow.com/questions/669452/is-double-square-brackets-preferable-over-single-square-brackets-in-ba
https://unix.stackexchange.com/questions/306111/what-is-the-difference-between-the-bash-operators-vs-vs-vs
marcin'82:
Tu masz fajne pomysły:
https://www.unix.com/302564602-post3.html?s=5931138e05edac6bc9c5a04612d216ac .
Nie używaj tylko podanej tam opcji --remove-files!
W skrócie - można to wykonać bez tworzenia cudów typu pętla, porównywanie, sr.... ;P
Dane:
--- Kod: ---
tree -a var
var
└── chroot
├── ABCD
├── ABDC
├── ACDB
├── BCDA
├── DCBA
├── nazwa_cos1
├── nazwa_cos2
└── nazwa_cos3
9 directories, 0 files
--- Koniec kodu ---
Polecenie:
--- Kod: ---
find var/chroot/* -maxdepth 1 -type d -not -name 'nazwa_*' -exec tar cvf {}.tar {} \;
--- Koniec kodu ---
Efekt:
--- Kod: ---
find -iname \*.tar
./var/chroot/DCBA.tar
./var/chroot/ABDC.tar
./var/chroot/BCDA.tar
./var/chroot/ACDB.tar
./var/chroot/ABCD.tar
--- Koniec kodu ---
Musisz odpowiednio dopasować warunek wyszukiwania -name LUB -not -name, żeby odfiltrować to czego nie chcesz, a pozostawić to, co ma być spakowane.
Nawigacja
Idź do wersji pełnej