Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Pomoc przy skrypcie.  (Przeczytany 2229 razy)

cwir

  • Gość
Pomoc przy skrypcie.
« dnia: 2012-06-25, 23:54:47 »
Witam.
  Moim zadaniem jest napisanie skryptu, ktory przyjmuje jako parametr maske nazwy pliku (np. "*.txt") i usuwa takie pliki (w katalogu bieżącym).
  Próbowałem to robić na wiele różnych sposobów i skrypty działają jedynie wtedy, gdy w katalogu bieżącym znajduje się tylko jeden plik spełniający warunki maski. Gdy w katalogu znajdują się dwa pliki z rozszerzeniem np. *.txt, to skrypt przestaje działać.
  Moje pomysły na skrypty to:
1)
#!/bin/bash
find . -iname "$1" | xargs rm
(z linii poleceń działa dla wszystkich plików - w skrypcie tylko dla jednego)
2)
#!/bin bash
find . -iname "$1" -exec rm -f {} \\;
3) Nawet próbowałem bawić się w usuwanie plików, które pasują do wzorca:
#!/bin/bash
zm="$1"
zm2=`cat temp | cut -f2 -d "."`
rm -f temp
zm3=.
zm4=$zm3$zm2
zm5=`ls -l | grep $zm4 | tr -s " " | cut -f2 -d "." | head -n1`
zm6="*."
zm7=$zm6$zm5
for plik in *
do
  if [ $plik == "$zm7" ]
  then
    rm -f $plik
  else
    echo "Plik nie pasuje"
  fi
done
W trzecim skrypcie chciałem uzyskać coś takiego:
zm=*.txt
zm2=txt (zapisanie *.txt do pliku i wycięcie samego txt)
zm3=.
zm4=.txt
zm5=txt (wydobycie końcówki nazwy pliku z katalogu bieżącego, który pasuje do wzorca przekazanego w parametrze skryptu)
zm6=*.
zm7=*.txt
I potem w pętli for sprawdzenie, czy nazwa obecnie czytanego pliku jest równa wzorcowi. I tu pojawia się problem.
Załóżmy, że w katalogu znajdują się pliki 1.txt 2.txt itd.
$plik == "$zm7"
System zamieni to na:
1.txt == *.txt" I wywali, że nazwy plików nie są równe. W tym miejscu chciałbym móc porównać 1.txt z WZORCEM *.txt
Chciałbym, żeby "*" była uważana za dowolny ciąg znaków, a nie jako znak "*".

Innych pomysłów na wykonanie tego skryptu nie mam... Chciałbym dostać od Was jakieś wskazówki lub chociaż podpowiedź, dlaczego skrypt sypie się na większej liczbie plików pasujących niż 1.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Pomoc przy skrypcie.
« Odpowiedź #1 dnia: 2012-06-26, 07:35:42 »
Bash rozwija wzorce w momencie przekazywania parametrów.

Jeżeli masz w katalogu pliki "plik1.txt" oraz "plik2.txt", to
./skrypt.sh *.txt
Jest rozwijane do:
./skrypt.sh plik1.txt plik2.txt
i wywoływane.

W tym przypadku, $1 będzie równe "plik1.txt" (nie "*.txt"), natomiast find wywoływany będzie w poszukiwaniu tego jednego, konkretnego pliku (-iname "plik1.txt").

W skryptach musisz uważać z używaniem masek, bo często są rozwijane do tekstu, np.
x=*
echo $x
wyświetli listę plików w aktualnym katalogu, a nie znak gwiazdki.

---

Jeżeli chcesz tego uniknąć, to: użyj "$@" (cała linia parametrów) zamiast "$1" w skrypcie, albo przekazuj parametry z użyciem cytowania:

./skrypt.sh "*.txt"
./skrypt.sh \\*.txt
Poczytaj sobie o cytowaniu w bashu.
---

Nie prościej użyć

rm *.txt
?

cwir

  • Gość
Pomoc przy skrypcie.
« Odpowiedź #2 dnia: 2012-06-26, 13:36:23 »
Dziękuję za rady, problem rozwiązany =]
Najprostszy sposób okazał się być najlepszy ;)

Offline Lord Darius

  • Guru
  • *****
  • Wiadomości: 1162
    • Zobacz profil
Pomoc przy skrypcie.
« Odpowiedź #3 dnia: 2012-06-26, 14:50:25 »
Cytat: cwir
Dziękuję za rady, problem rozwiązany =]
Najprostszy sposób okazał się być najlepszy ;)
Zatem pozwolę sobie zamknąć wątek.

---edit
p.s
Sam wątek zalatuje nieco pracą domową, jednak cwir wykazał się własnymi umiejętnościami, a przede wszystkich własną chęcią rozwiązania problemu przy wsparciu kolegi vanhelzing - co sprawia, iż nie podlega on pod poniższe:
http://forum.linux.pl/viewtopic.php?pid=119010#p119010
Spójrz bez strachu na rzecz budzącą strach, a straszność sama zniknie.
cat /etc/debian_version