Nowe posty

Autor Wątek: Bash - skrypt pętla for, if i foldery  (Przeczytany 387 razy)

Offline bercikrk

  • Nowy na forum
  • *
  • Wiadomości: 1
    • Zobacz profil
Bash - skrypt pętla for, if i foldery
« dnia: 2021-06-23, 14:41:54 »
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

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2480
  • 1709
    • Zobacz profil
Odp: Bash - skrypt pętla for, if i foldery
« Odpowiedź #1 dnia: 2021-06-24, 00:45:19 »
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.
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.


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.

https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html

$ 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

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

« Ostatnia zmiana: 2021-06-24, 07:44:30 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline marcin'82

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 323
    • Zobacz profil
Odp: Bash - skrypt pętla for, if i foldery
« Odpowiedź #2 dnia: 2021-06-24, 22:26:10 »
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:
tree -a var

var
└── chroot
    ├── ABCD
    ├── ABDC
    ├── ACDB
    ├── BCDA
    ├── DCBA
    ├── nazwa_cos1
    ├── nazwa_cos2
    └── nazwa_cos3

9 directories, 0 files

Polecenie:
find var/chroot/* -maxdepth 1 -type d -not -name 'nazwa_*' -exec tar cvf {}.tar {} \;

Efekt:
find -iname \*.tar
./var/chroot/DCBA.tar
./var/chroot/ABDC.tar
./var/chroot/BCDA.tar
./var/chroot/ACDB.tar
./var/chroot/ABCD.tar

Musisz odpowiednio dopasować warunek wyszukiwania -name LUB -not -name, żeby odfiltrować to czego nie chcesz, a pozostawić to, co ma być spakowane.