كيف أقوم بعمل "استدعاء نظام إلى ملفات TAR (جنبًا إلى جنب مع العلامة)" للعمل في بيرل
-
24-09-2019 - |
سؤال
هذه هي مكالمة النظام ، أنا أقوم الآن في بيرل لتخري الملفات
system("${tarexe} -pcvf $tarname $includepath") which works fine.
$tarexe -> location of my tar.exe file
$tarname -> myMock.tar
$includepath -> ./input/myMockPacketName ./input/myPacket/my2/*.wav ./input/myPacket/my3 ./input/myPacket/in.html
الآن أريد استبعاد بعض الملفات باستخدام العلامة Exclude ، والتي لا تستبعد الملفات
system("${tarexe} -pcvf $tarname $includepath --exclude $excludepath")
$excludepath -> ./input/myMockPacketName/my3
نفس القمامة
${tarexe} -pcvf $tarname $includepath --exclude $excludepath
لا يعمل عندما أقوم بتشغيله في سطر الأوامر.
المحلول
@نجم النجوم -
بالنسبة إلى أسسلك المحدد ، يجب أن يكون exclude "./input/mymockpacketname/my3/*" بدلاً من "./input/mymockpacketname/my3" من ما أتذكره من GNU TAR. أيضا ، من المفترض أن تتابع أسماء الملفات المضمونة -أشياء Exclude ؛ التي يجب نقلها بشكل صحيح
لكن
لماذا تخبرك المتطلبات كيف تفعل الأشياء بدلاً من ما يجب القيام به؟
ما لم تكن الواجب المنزلي (في هذه الحالة ، يرجى أن تكون مقدمًا بشأنه)
... أو تلك هي المتطلبات من فريق الهندسة المعمارية العامة لبعض الشركة (وفي هذه الحالة يجب أن يتم تعليمهم بأدب أن أفضل الممارسات المعيارية للصناعة هي استخدام المكتبات الأصلية لبيرل على مكالمات النظام كلما كان ذلك ممكنًا ما لم يكن هناك سبب واضح للقيام بخلاف ذلك) ...
في كل حالات أخرى ، يجب عليك تحديد طريقة استخدامها للتنفيذ.
نصائح أخرى
ليس لدي أدنى فكرة عن سبب --exclude
لا يعمل. لكنني سأقدم لك نصيحة بيرل المفضلة لدي عندما أرى أ system
في الاستخدام.
لا
بالطبع في بعض الأحيان تكون ضرورية ولكن تحقق أولاً إذا كانت هناك وحدة CPAN للقيام بالمهمة بدلاً من ذلك. في هذه الحالة أقترح أرشيف :: targzip عادة سأستخدمها أرشيف :: القطران لكنني لم أجد --exclude
وظائف (كان لدي نظرة سريعة فقط لذلك قد يكون هناك)
ليست إجابة مباشرة على السؤال ولكن تلميحًا قد يساعدك في تحديد مشاكل مثل هذه في المستقبل:
بدلا من الكتابة
system("${tarexe} -pcvf $tarname $includepath --exclude $excludepath")
افعل شيئًا مثل
my $command = "${tarexe} -pcvf $tarname $includepath --exclude $excludepath" ;
print "About to run $command\n" ;
system $command ;
يمكنك بعد ذلك قطع ولصق الإخراج في نافذة طرفية جديدة. أو يمكنك اكتشاف أن الأمر الذي تم إنشاؤه هو ما كنت تعتقد أنه كان.
تنصل - أتفق مع معظم الأشخاص الذين لديهم ansewred هذا السؤال بأن استخدام وحدات Perl Tar سيكون أفضل ، ولكن قبول أنه قد تكون هناك أسباب للقيام بذلك بهذه الطريقة