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

[0] Indeks wiadomości

Idź do wersji pełnej