Linux如何在将文件传输到tar之前,在文件周围放置双引号?

我用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有它…