Nowe posty

Autor Wątek: jak polaczyc find z read i cp  (Przeczytany 2799 razy)

Inesz

  • Gość
jak polaczyc find z read i cp
« dnia: 2012-01-15, 15:35:39 »
mam maly wielki problem chce zrobic skrypt który znajduje pliki (find) i kopiuje je do odpowiedniego katalogu, tylko nie wiem jak to polaczyć bo w miedzyczasie chce zeby wyniki zostaly wypisane na ekran i chce aby pokazywalo sie pytanie czy na pewno chce je przeniesc. Wolala bym uniknac dwukrotnego przeszukiwania, pomyslalam ze moze wyniki zapisac w pliku tekstowym ale tu mam kolejna zagadke x) znajduje, zapisuje ale jak to potem odtworzyc ...

prosze o pomoc w jednym albo w drugin przypadku dopiero zaczynam programowac wiec prosze lopatologicznie

z gory dzieki ;)

Ksanderon

  • Gość
jak polaczyc find z read i cp
« Odpowiedź #1 dnia: 2012-01-15, 18:41:58 »
można to zrobić chyba tak:
for i in "$(find . -name *.c)"
do
cp "$i" "katalog/"
echo "$i"
done
skrypt wyszukuje pliki których nazwa kończy się na .c zaczynając od katalogu, w którym się znajduje "w głąb" do lokalnego katalogu katalog i przy okazji wypisuje początkowe położenie (wraz z nazwą) wyszukanych plików. Nie jestem ekspertem w tej dziedzinie ale przed chwilką to popełniłem i chyba działa:)

#co do tego pytania o to czy kopiować możesz zrobić: a="$(find warunek)"->for wypisujący wyniki-> pytanie czy kopiować->if->for kopiujący lub koniec.

  • Gość
jak polaczyc find z read i cp
« Odpowiedź #2 dnia: 2012-01-15, 19:01:25 »
Po pierwsze, potraktuje wszystkie pliki jako jeden ciąg znaków, więc nic nie przekopiuje (chyba że find znajdzie tylko jeden plik).
Po drugie, gdyby usunąć cudzysłów z for, byłoby prawie dobrze. Prawie, bo spektakularnie wywróci się na plikach i katalogach ze spacjami w nazwie.

Najlepiej by było wynik finda przepotokować do read, ale nie mam dobrego pomysłu, jak w takiej sytuacji odczytywać dane wejściowe od użytkownika (co jest jednym z założeń OP). Nie mam też czasu specjalnie długo się teraz nad tym zastanawiać.

arctgx

  • Gość
jak polaczyc find z read i cp
« Odpowiedź #3 dnia: 2012-01-16, 00:48:11 »
Zajrzałem do man -LC find i trafiłem na akcję daną parametrem -ok. Zależnie od wpisanej odpowiedzi, wykona ona polecenie lub zwróci fałsz. Szkoda tylko, że przy tym sposobie nie można wprost sformułować pytania, a zamiast tego widać tylko polecenie, które ma być wykonane lub nie. Dla kogoś nieznającego cp i find nie będzie to zrozumiałe, chyba że używać ma go sam autor.

P.S. Podpowiedź: pytanie można wyświetlić, używając akcji -exec przed akcją -ok.

Podstawy używania finda to już ewentualna lektura (manuala i przykładów w sieci, np. na tym forum) i ćwiczenia dla Ciebie. Zdaje się, że to praca domowa.

Ksanderon

  • Gość
jak polaczyc find z read i cp
« Odpowiedź #4 dnia: 2012-01-16, 09:08:26 »
minio ma rację, wiedziałem, że spacje są problemem, więc dodałem cudzysłowy, rozw. nie testowałem. Myślę, że w bashu można to zrobić ale jest upierdliwe.

jeśli interesuje cie tylko rozwiązanie to skleciłem w pythonie:

import fnmatch
import os
import shutil

def find(mydir='.', pattern='*'):
return [os.path.join(mydir, filename)
for mydir, dirnames, filenames in os.walk(mydir)
for filename in filenames
if fnmatch.fnmatch(filename, pattern)]

files = find('.', '*.c')
for i in files:
print i

odp = raw_input("Znaleziono "+str(len(files))+" plikow. Kontynuowac kopiowanie?")
if odp=="tak":
for i in files:
shutil.copy(i, "./katalog/")

xavery

  • Gość
jak polaczyc find z read i cp
« Odpowiedź #5 dnia: 2012-01-17, 10:49:58 »
Cytat: Inesz
mam maly wielki problem chce zrobic skrypt który znajduje pliki (find) i kopiuje je do odpowiedniego katalogu, tylko nie wiem jak to polaczyć bo w miedzyczasie chce zeby wyniki zostaly wypisane na ekran i chce aby pokazywalo sie pytanie czy na pewno chce je przeniesc.
(...)
To chcesz skopiować czy przenieść, bo różnica jest znaczna:)
A do realizacji tego zadania powinna wystarczyć jakaś kombinacja find +cp lub mv (z opcją -i)

xavery

  • Gość
jak polaczyc find z read i cp
« Odpowiedź #6 dnia: 2012-01-17, 10:59:00 »
Cytat: xavery
A do realizacji tego zadania powinna wystarczyć jakaś kombinacja find +cp lub mv (z opcją -i)
A o ile dobrze zrozumiałem zadanie oraz jeśli pliki  źródłowe znajdują się w tym samym katalogu to wystarczy polecenie cp (mv) -vi *wzorzec*plików* katalog_docelowy/