To polecenie:
find ./ -name "mybinaryrpm-1.0.24-1.1.i586.rpm"
daje wynik:
./DirectoryName/SubDirectory/mybinaryrpm-1.0.24-1.1.i586.rpm
ale chcę tylko wynik:
mybinaryrpm-1.0.24-1.1.i586.rpm
Jak mogę to zdobyć?
Co tak naprawdę próbuję zrobić:
- Przeczytaj plik wejściowy, który zawiera listę nazw plików binarnych oddzielonych od siebie liniami
- Wyszukaj pliki o odpowiednich nazwach w bieżącym katalogu rekurencyjnie
- Jeśli znaleziono więcej niż jedno dopasowanie, rozważ tylko jeden wynik wyszukiwania i skopiuj plik do odpowiedniego katalogu docelowego.
Aktualny kod:
while read line; do
binaryRpm=$(find ./ -name "$line" -exec basename {} \;)
echo " [ Read From File: $line ] <==> [ Find Command Searched: $binaryRpm ]"
## If found then copy the binary file to dest dir
## TODO: If Find Command finds more than One File with the
## Same Name, then ONLY ONE FILE MUST be Compared and copied to
## the Release Directory
if [ "$line" != "$binaryRpm" ]; then
echo "---------- Binary File Searching---------- "
continue
else
echo " !!!!!! Binary File Found ==> $binaryRpm !!!!!! "
fi
done < "$FILENAME"
ubuntu-10.04
find
sree
źródło
źródło
Odpowiedzi:
Cóż, twój przykład naprawdę nie ma sensu, ponieważ, jak zauważono w komentarzu, chcesz uzyskać takie same wyniki, jak podajesz jako dane wejściowe. Jeśli znasz dane wejściowe, znasz już dane wyjściowe.
Ale w ogóle, należy użyć
find
„s-printf
funkcję:Z
man find
sekcji-printf
:Jest to dostępne tylko dla GNU find, ale narzędzia GNU są standardem w Linuksie, o który prosiłeś. Można go również zainstalować na mniej więcej każdej odpowiedniej platformie.
Minimalny przykład kodu, który robi to, co wygląda na to, że naprawdę próbujesz:
Komentarze do mojego powyższego przykładu:
head -1
zachowa tylko pierwszy mecz.[ -z ]
sprawdza, czy zmienna jest pusta (będzie pusta, jeślifind
nie znajdzie niczego powyżej).Komentarze do twojego skryptu:
find
zwróci tylko te, które pasują. Myślę, że używasz go do odrzucania wielu dopasowań, alehead
jest to lepsze narzędzie do tego.continue
instrukcji w niezmienionej postaci, ponieważ skrypt wyskoczy zif
klauzuli i powtórzyfor
pętlę bezpośrednio po niej.źródło
find
ten sposób.Wypróbuj to polecenie:
źródło
Aby odpowiedzieć na twoje pytanie, możesz spróbować czegoś takiego:
find ./ -name "mybinaryrpm-1.0.24-1.1.i586.rpm" | sed 's|^\..*/\(.*\)|\1|g'
źródło