Wyodrębnij pojedynczy katalog z rpm

0

Jestem w stanie wyodrębnić pojedynczy plik rpm rpm przez:

rpm2cpio rpm_name | cpio -ivd ./a/b/c/README

Muszę wyodrębnić cały katalog / a / b / c / (użycie polecenia ./a/b/c/ w powyższym poleceniu nie działa)?

  1. Jak można to zrobić?
  2. Czy mogę wskazać, gdzie utworzyć katalog „c /” zamiast ./a/b/c?
dimba
źródło

Odpowiedzi:

2
  1. użyj symbolu wieloznacznego, ale uważaj, aby chronić go przed powłoką:

    rpm2cpio rpm_name | cpio -ivd './a/b/c/*'

  2. Nie bezpośrednio, ale cpio ma -r/--rename przełącznik. Istnieją niestety dwa problemy: pyta o każdy plik i pobiera dane wejściowe /dev/tty bezpośrednio. Co oznacza, że ​​nie jest łatwo go zautomatyzować. Możesz użyć expect program, jeśli naprawdę chcesz to zrobić. Ostrzeżenie : nie dla słabych serc;) Zauważ, że nie obsługuje poprawnie plików z cudzysłowami (lub prawdopodobnie spacjami). Oczekuje nazwy pliku rpm, wzorca plików do wyodrębnienia i sed polecenie przekształcenia każdego pliku. Przykład użycia:

    cpio.sh rpm_name './a/b/c/*' 's#^./a/b/#foo/#'

Teoretycznie skrypt mógłby zostać przesłany expect ale to pozostało jako ćwiczenie dla czytelnika.

#! /bin/bash

SCRIPT=/tmp/$$.expect
RPM="$1"
FILES="$2"
TRANSFORM="$3"

echo "spawn sh -c \"rpm2cpio \\\"$RPM\\\" | cpio -ird '$FILES'\"" > "$SCRIPT"
rpm2cpio "$RPM" | cpio -it "$FILES" 2>/dev/null | sed "$TRANSFORM" | while read line
do
    echo "send \"$line\\r\"" >> "$SCRIPT"
done
echo "wait" >> "$SCRIPT"
expect "$SCRIPT"
rm -f "$SCRIPT"
Jester
źródło
Twoje pierwsze rozwiązanie jest tym, czego szukałem. Dzięki
dimba