Nowe posty

Autor Wątek: [bash] formatowanie wyjścia 'find' - pomocy  (Przeczytany 3816 razy)

^robert^

  • Gość
[bash] formatowanie wyjścia 'find' - pomocy
« dnia: 2008-05-11, 20:44:18 »
Witam!

Ostatnio napisałem sobie prosty skrypt który niestety nie zawsze sobie radzi z danymi wejściowymi. Problem pojawia się wtedy gdy nazwa folderu z plikiem składa się z kilku wyrazów oddzielonych spacjami. Proszę pomóżcie mi go tak przerobić aby działał zawsze.

oto kod:

for file in $(find -name "*.tiff")
do
  cp -v $file /media/Elements/tiff/
done

jk33

  • Gość
[bash] formatowanie wyjścia 'find' - pomocy
« Odpowiedź #1 dnia: 2008-05-11, 21:13:02 »
Zainteresuj się zmienną IFS w bashu:
to ona odpowiada, za to które znaki oddzielają kolejne elementy dla pętli, a które nie.

Poza tym:
masz świadomość, że ten skrypt można zapisac prościej?
for file in *.tiff
do
  cp -v $file /media/Elements/tiff/
done
wtedy nie potrzebujesz zmiennej IFS i nie wywołujesz zewnętrznego polecenia -- find.

arctgx

  • Gość
[bash] formatowanie wyjścia 'find' - pomocy
« Odpowiedź #2 dnia: 2008-05-11, 22:34:30 »
Popróbowałbym też z objęciem wartości $file cudzysłowem. Nigdy nie zaszkodzi niezależnie od ustawień IFS. Cudzysłów (nie apostrof) maskuje specjalne znaczenie spacji jako separatora pól.

  ff $ touch "a b"
  ff $ ls -1
a b
  ff $ for i in *; do cp $i /tmp; done
cp: nie można wykonać stat na `a': Nie ma takiego pliku ani katalogu
cp: nie można wykonać stat na `b': Nie ma takiego pliku ani katalogu
  ff $ for i in *; do cp "$i" /tmp; done
`a b' -> `/tmp/a b'
  ff $ echo \\"$IFS\\"
" "
Ponieważ IFS jest złożona z białych znaków wyświetliłem ją w cytowanych cudzysłowach, żeby wiadomo było gdzie zaczyna się i kończy. U mnie więc była to spacja.

maciasz

  • Gość
[bash] formatowanie wyjścia 'find' - pomocy
« Odpowiedź #3 dnia: 2008-05-12, 11:23:32 »
Łatwiej będzie
find /kat1 -name \\*.tiff -exec cp -v {} /kat2 \\;
Pozdrawiam


---- Ten wątek został podzielony ----
Wszystkie oddzielone posty znajdują się tutaj.
(Podziału dokonał użytkownik arctgx)