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 [quoted wordlist] 选项的原因...
例如[tcsh]
foreach FILE ( *mysearchstring* )
tar -xvf $FILE:q
end
如果您愿意,也可以用 tar -xvf "$FILE" 代替 tar -xvf $FILE:q。
如果你真的必须使用ls...
使用通过任何管道传输的 ls 将每行输出一个文件名。使用 tr 我们可以将换行符转换为任何其他字符,例如 null。 xargs 可以接收以空字符结尾的字符串。这规避了空间问题。使用 -n1 将克服多文件问题。
例如:\ls | grep 我的搜索字符串 | tr '\012' '\0' | xargs --null -n1 焦油 -xvf
但我不相信 tar 像 OP 那样能够容纳来自标准输入的多个 tar 文件...