Puncte:1

GNU tar - actualizați fișierul tar, suprascriind fișierul original în linia de comandă (care este posibil prin glisare și plasare în Managerul de arhive)

drapel cn

Vreau să actualizez un fișier tar cu o parte din conținut modificat, prin suprascrierea fișierului original, într-un script.

am incercat tar -u, -A și -r, dar nimeni nu face ce vreau eu. am incercat si cu -- suprascrie.

Un test ușor:

cd ~
testul mkdir
echo foo > test1.txt
mkdir test_dir
cd test_dir
echo bar > test2.txt
cd ../..
tar cvf test.tar test
tar tvf test.tar # verifica conținutul
echo barbarbar >> test/test_dir/test2.txt
tar rvf test.jar test # sau Avf, sau uvf, este la fel: fișierul modificat nu suprascrie fișierul original în tar
  • -u --suprascrie teoretic se va „actualiza”, dar de fapt se adaugă doar fișierul modificat și nu se adaugă, așa că văd două test1.txt și unul test2.txt acolo în gudron, cu test2.txt fiind cel vechi
  • -A --suprascrie teoretic se va adăuga, dar erorile sunt: tar: test: eroare de citire la octetul 0, în timp ce citiți 1024 de octeți: este un director tar: eroarea nu poate fi recuperată: ieșire acum
  • -r --suprascrie teoretic va "adăuga", dar va adăuga doar și nu va suprascrie, așa că văd două test1.txt si doi test2.txt în gudron.

M-am gândit: OK, atunci tar nu include posibilitatea de a actualiza tar-ul în loc. Dar apoi îmi amintesc că acest lucru poate fi realizat cu ușurință trăgând noul folder în fișierul tar din Gnome (cred că acest lucru este gestionat de „Manager de arhivă”), așa că este cel puțin posibil.

Cum pot suprascrie fișierele în tar în linia de comandă/script?

SaveUkraine-StartPeaceTalk avatar
drapel cn
material conexe: https://www.gnu.org/software/tar/manual/html_node/Dealing-with-Old-Files.html
SaveUkraine-StartPeaceTalk avatar
drapel cn
Înrudit: https://www.linuxquestions.org/questions/linux-newbie-8/how-to-overwrite-existing-files-by-using-tar-command-remove-extra-files-4175489175/#post5087034
WesternGun avatar
drapel cn
Nu, nu îmi rezolvă problema. Te rog, dacă chiar vrei să ajuți, testați-l mai întâi: `-u` în acel link va adăuga un alt fișier cu același nume; dacă șterg după nume, sunt două fișiere cu același nume, de unde să știu sigur că cel pe care îl șterg este fișierul pe care nu-l doresc? Adică, există un motiv pentru care întreb aici, pentru că nu găsesc nimic care să funcționeze dacă îl caut pe Google în altă parte.
drapel ru
Vă răcoriți amândoi. Comentariile la această întrebare sunt acum blocate pentru săptămâna viitoare pentru a vă opri cearta.
Puncte:2
drapel cn

ai putea crea un script care să creeze un alt tarball în loc să actualizezi originalul și apoi să îl elimini pe original și să îl redenumești pe cel nou ca original...

modul în care aplicația „manager de arhivă” face probabil acest lucru este puțin mai avansat și nu m-aș deranja să încerc să imit acel comportament în bash, dar asta nu înseamnă că nu ar trebui să încerci...

WesternGun avatar
drapel cn
Da, acesta este ceva ce vreau să încerc, mulțumesc. Voi elimina fișierul original din tar și îl voi adăuga pe cel modificat.
Puncte:0
drapel cn

Am găsit acest paragraf în GNU gudron doc, deci suprascrierea nu este acceptată de gudron. Voi elimina fișierul original din tar și îl voi adăuga pe cel modificat.

https://www.gnu.org/software/tar/manual/html_node/how-to-update.html#how-to-update

4.2.3.1 Cum se actualizează o arhivă utilizând â--updateâ

Trebuie să utilizați argumente de nume de fișier cu operația â--updateâ (â-uâ). Dacă nu specificați niciun fișier, tar nu va acționa asupra niciunui fișier și nu vă va spune că nu a făcut nimic (ceea ce ar putea ajunge să vă încurce).

Pentru a vedea opțiunea â--updateâ la locul de muncă, creați un fișier nou, âclasicâ, în directorul de practică și ceva text suplimentar în fișierul âbluesâ, folosind orice editor de text . Apoi invocați tar cu operațiunea âupdateâ și opțiunea â--verboseâ (â-vâ) specificată, folosind numele tuturor fișierelor din directorul âpracticeâ ca argumente de nume de fișier:

$ tar --update -v -f collection.tar blues folk rock clasic
blues
clasic
$

Deoarece am specificat modul verbose, tar tipărește numele fișierelor la care lucrează, care în acest caz sunt numele fișierelor care trebuiau actualizate. Dacă rulați âtar --listâ și vă uitați la arhivă, veți vedea âbluesâ și âclassicalâ la sfârșitul acesteia. Vor exista în total două versiuni ale membrului âbluesâ; cel de la sfârșit va fi mai nou și mai mare, deoarece ați adăugat text înainte de a-l actualiza.

Motivul pentru care tar nu suprascrie fișierul mai vechi atunci când îl actualizează este că scrierea la mijlocul unei secțiuni de bandă este un proces dificil. Benzile nu sunt concepute pentru a merge înapoi. Consultați secțiunea Benzi și alte medii de arhivă, pentru mai multe informații despre benzi.

EDITAȚI | ×: --șterge nu funcționează/este foarte lent. Se pare că ștergerea fișierelor din tar nu este foarte fezabilă, poate prin proiectare. Cred că trebuie să extrag/elimină/reambalez, sau: https://unix.stackexchange.com/questions/68732/remove-files-from-tar-archive dar inca nu stiu cum.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.