我用ls来获得我的文件名,它有空白,所以它看起来像这样:
my file with whitespace.tar.bz2
我想pipe这个tar类似于:
ls | grep mysearchstring | tar xvjf
如何在inputtar之前插入双引号?
一个好的工具是find和xargs。 例如,您可以使用:
find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf
像pixelbeat建议你也可以这样使用shell:
for archive in *.tar.bz2; do tar xvjf "$archive"; done
shell通配符扩展有什么问题? (假设只有一个文件名)
% tar -cvf *mysearchstring* % tar -xvf *mysearchstring*
当然,匹配* mysearchstring *的文件名将会有空格。 但是shell [tcsh,bash]会把这个文件名( 包括它的空格)分配给一个tar参数。
您可以使用简单的C或C ++程序进行验证。 例如:
#include <iostream> using namespace std; int main( int argc, char **argv ) { cout << "argc = " << argc << endl; for ( int i = 0; i < argc; i ++ ) cout << "argv[" << i << "] = \"" << argv[i] << "\"" << endl; return 0; }
试试看: ./a.out * foo *
这就是为什么CSH有:q [引用的单词列表]选项…
例如[tcsh]
foreach FILE ( *mysearchstring* ) tar -xvf $FILE:q end
或tar -xvf“$ FILE”而不是tar -xvf $ FILE:q ,如果你愿意的话。
如果你真的要用ls …
使用ls通过任何东西将输出每行一个文件名。 使用tr我们可以将换行符翻译为任何其他字符,例如null。 xargs可以接收以null结尾的字符串。 这规避了空间问题。 使用-n1将克服多个文件的问题。
例如:\ ls | grep mysearchstring | tr'\ 012''\ 0'| xargs –null -n1 tar -xvf
但我不相信焦油容纳多个tarfiles从标准偏差像OP有它…