Nowe posty

Autor Wątek: Problem z zastosowaniem find  (Przeczytany 3264 razy)

ktosia

  • Gość
Problem z zastosowaniem find
« dnia: 2008-12-16, 22:59:50 »
Witam,

Mam problem z zastosowaniem find cos -printf
Czytam manual i czytam, ale niestety mimo wszystko nie umiem zrobić tego co "chcę"
(źródło do man z którego korzystam: http://www.ss64.com/bash/find.html)

W każdym razie, chcę aby do pliku były zapisywane: nazwa oraz data modyfikacji wszystkich plików które znajdują się w katalogu. I tu pojawi się problem, myślałam że coś w stylu:
find $1 -printf %p %t > plik.txt
jest wystarczające, jednak pojawiają się błędy :( tzn. "paths must precede expression", no i nie wiem co z tym zrobić :( próbowałam różnych opcji, nawet jakieś nawiasy tam wstawiałam i nic... z jedną "czymś po %" działa, ale tak jak powiedziałam potrzebuję tych dwóch rzeczy.

Bardzo proszę o pomoc :) i o wybaczenie za "laicyzm" ale się uczę :)

pozdrawiam
Ktosia

arctgx

  • Gość
Problem z zastosowaniem find
« Odpowiedź #1 dnia: 2008-12-17, 00:17:31 »
Może wystarczy, że ujmiesz zestaw znaków formatujących w parę apostrofów.

ktosia

  • Gość
Problem z zastosowaniem find
« Odpowiedź #2 dnia: 2008-12-17, 23:01:47 »
wystarczyło :)

w każdym razie dalej mam problem i już nie mam pomysłu dlaczego to nie działa :(

w skrócie jest to praca domowa na systemy operacyjne, program ma sprawdzać pliki w dwóch katalogach i jako wynik pracy w obu katalogach mają znaleźć się takie same pliki.
#!/bin/bash
if [  $# -ne 2 ];
then
   echo "Za malo parametrow"
   exit
fi

TMP="temp.txt"
TMP2="temp2.txt"
KAT1="tylko-w-katalogu1.txt"
KAT2="tylko-w-katalogu2.txt"
COMMON="wspolne-katalog1-katalog2.txt"
NEW1="nowsze-w-katalogu1.txt"
NEW2="nowsze-w-katalogu2.txt"

rm -rf $TMP $TMP2 $KAT1 $KAT2 $COMMON $NEW1 $NEW2

find $1/ -printf "%f\\t %h\\t %t\\n" | sort > temp.txt
find $2/ -printf "%f\\t %h\\t %t\\n" | sort > $TMP2

#plik tylko-w-katalogu1.txt
for i in `comm -23 $TMP $TMP2`
do
   find $1/ -name "$i" -printf "%f\\t %h\\n" >> $KAT1
done

#plik tylko-w-katalogu2.txt
for i in `comm -13 $TMP $TMP2`
do
   find $2/ -name "$i" -printf "%f\\t %h\\n" >> $KAT2
done

#wspolne
find $1/ -name "*" -type "f" -printf "%f\\t %h\\t %t\\n" | sort
> $TMP
find $2/ -name "*" -type "f" -printf "%f\\t %h\\t %t\\n" | sort
> $TMP2
comm -12 $TMP $TMP2 > $COMMON

#nowsze w katalogach
find $1/ -name "*" -type "f" -printf "%f\\n" | sort > $TMP
find $2/ -name "*" -type "f" -printf "%f\\n" | sort > $TMP2
for i in `comm -12 $TMP $TMP2`
do
   CZAS1=`find $1/ -name "$i" -printf "%T@\\n"`
   CZAS2=`find $2/ -name "$i" -printf "%T@\\n"`
   if [ $CZAS1 -gt $CZAS2 ];
   then
       find $1/ -name "$i" -printf "%f\\t %h\\t %t\\n" >>
$NEW1
   fi
   if [ $CZAS2 -gt $CZAS1 ];
   then
       find $2/ -name "$i" -printf "%f\\t %h\\t %t\\n" >>
$NEW2
   fi
done

#wyswietlanie na ekranie
echo "Porownywanie katalogow: \\"$1\\" vs \\"$2\\""
if [ -f $KAT1 ];
then
   echo -e "\\nPliki unikalne dla \\"$1\\" :"
   cat -n $KAT1
fi

if [ -f $KAT2 ];
then
   echo -e "\\nPliki unikalne dla \\"$2\\" :"
   cat -n $KAT2
fi

if [ -s $COMMON ];
then
   echo -e "\\nWspolne pliki: "
   cat -n $COMMON
fi

if [ -f $NEW1 ];
then
   echo -e "\\nPliki wspolne dla katalogow ale nowsze w \\"$1\\" :"
   cat -n $NEW1
fi

if [ -f $NEW2 ];
then
   echo -e "\\nPliki wspolne dla katalogow ale nowsze w \\"$2\\" :"
   cat -n $NEW2
fi

if [ -f $NEW1 -o -f $NEW2 ];
then
   echo "Dokonac synchronizacji ? [T/N]"
   read WYBOR
   if [ "$WYBOR" = "T" -o "$WYBOR" = "t" ];
   then
       for i in `comm -12 $TMP $TMP2`
       do
           CZAS1=`find $1/ -name "$i" -printf "%T@\\n"`
           CZAS2=`find $2/ -name "$i" -printf "%T@\\n"`
           if [ $CZAS1 -gt $CZAS2 ];
           then
               cp -p $1/$i $2/$i
           fi
           if [ $CZAS2 -gt $CZAS1 ];
           then
               cp -p $2/$i $1/$i
           fi
       done
   fi
fi
rm -rf $TMP $TMP2
Po wykonaniu pojawia mi się błąd:
Cytuj
find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name PLIKI-KATALOG1/' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ PLIKI-KATALOG1/'.
find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name PLIKI-KATALOG2/' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ PLIKI-KATALOG2/'.
No i kompletnie już mi ręce opadają i nie mam pojęcia jak to poprawić... wiem że należało by pisać po kawałku, no ale wyszło jak wyszło... i nie wiem gdzie mam szukać błędów.
Mimo błędów, program się jakoś tam uruchamia, ale nie spełnia założeń... tzn. efektem końcowym ma być to że w obydwu katalogach znajdują się te same pliki. Skrypt wyświetla pliki w katalogu1, w katalogu2 ale juz wspólnych plików nie wyświetla :/

arctgx

  • Gość
Problem z zastosowaniem find
« Odpowiedź #3 dnia: 2008-12-17, 23:59:09 »
Na szybko i powierzchownie: dlaczego w przeszukiwanych katalogach dodajesz ukośniki? Zerknij na surowe wyjście polecenia comm - niestety ja teraz nie poświęcę temu czasu.