Что не так с расширением оболочки-подстановки? (Предполагается, что есть только одно имя файла.)
% tar -cvf *mysearchstring*
% tar -xvf *mysearchstring*
Конечно, имя файла, которое соответствует * mysearchstring *, будет содержать пробелы. Но оболочка [tcsh, bash] назначит это имя файла , включая его пробелы , одному аргументу tar.
Вы можете проверить это с помощью простой программы на C или C ++. E.g.:
#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 , мы можем переводить символы новой строки на любой другой символ, например, ноль. xargs может принимать строки с нулевым символом в конце. Это обходит проблему пространства. Использование -n1 позволит решить проблему с несколькими файлами.
Например: \ ls | grep mysearchstring | tr '\ 012' '\ 0' | xargs --null -n1 tar -xvf
Но я не верю, что tar вмещает несколько tar-файлов из stdin, как это имеет OP ...