it-swarm.asia

القطران استخراج تجاهل بنية الدليل

unzip لديه خيار أنيق -j ، حيث يتم تجاهل بنية دليل الأرشيف ، ويتم استخراج جميع الملفات في نفس الدليل.

هل هناك طريقة لجعل tar يعمل بنفس الطريقة؟ لا شيء في صفحة الرجل يبدو أنه يشير إلى ذلك.

لذلك ، هل هناك أداة بديلة ، ويفضل أن تكون برمجيات حرة ، ستقوم بذلك؟

34
Benji XVI

يعيش جنو تار على التهاب السيلكون ، لذلك من الطبيعي أن يكون لديه أيضًا بعض الخيارات لذلك.
http://www.gnu.org/software/tar/manual/html_node/transform.html

إذا كنت ترغب فقط في إزالة بعض مقاطع المسار ، فغالبًا ما تقوم --strip-components=n أو --strip=n بما يلي:

 tar xvzf tgz --strip=1

ولكن من الممكن أيضًا إعادة كتابة الملفات المراد استخراجها (الإشارات هي --transform أو --xform وقبول ereg مع /x modifer):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

لإدراج tar ، تحتاج إلى خيار --show-transformed الإضافي:

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

أعتقد أن خيارات إعادة الكتابة تعمل أيضًا للتغليف ، وليس فقط للاستخراج. لكن pax من الواضح أن بناء جملة أجمل.

74
mario

يمكنك أن تفعل ذلك بسهولة إلى حد ما في خطوتين. التكيف حسب الضرورة:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
13
MikeyB

pax تستطيع أن تفعل ذلك:

pax -v -r -s '/.*\///p' < archive.tar

أو

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

يمكنك التحقق من عملية استبدال الاسم أولاً عن طريق حذف الخيار -r.

8
hfs

حل ممكن لا يتطلب تثبيت أي شيء.

  1. استخدم tar tvf للاستيلاء على جميع الملفات من tarball
  2. قم باستخراج هذه الملفات بشكل فردي - قم باستخراج tar إلى stdout وإعادة التوجيه إلى $ filename

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

حفظ كـ extract.sh وتشغيله كـ extract.sh myfile.tar. كما سيتم الكتابة فوق أي أسماء ملفات مكررة تمت مصادفتها في الدلائل التي تم سحبها من لعبة tarball.

1
DaveParillo