




Хороший инструмент для этого - find и xargs. Например, вы можете использовать:
find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf
Как предложил pixelbeat, вы также можете использовать оболочку следующим образом:
for archive in *.tar.bz2; do tar xvjf "$archive"; done
найти | xargs - самый общий и производительный. Для чистой оболочки следующие символы будут обрабатывать пробелы: для архива в * .tar.bz2; сделать tar xvjf "$ archive" готово
Что не так с расширением shell-wildcard? (Предполагая, что есть только одно имя файла.)
% tar -cvf *mysearchstring*
% tar -xvf *mysearchstring*
Конечно, имя файла, которое соответствует * mysearchstring *, будет содержать пробелы. Но оболочка [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 "$ ФАЙЛ" вместо tar -xvf $ ФАЙЛ: q, если хотите.
Если вам действительно нужно использовать ls ...
Использование ls, пропущенного через что-либо, будет выводить одно имя файла в строке. Используя tr, мы можем преобразовать символы новой строки в любой другой символ, например нуль. xargs может получать строки с завершающим нулем. Это позволяет обойти проблему с пробелами. Использование -n1 решит проблему нескольких файлов.
Например: \ ls | grep mysearchstring | tr '\ 012' '\ 0' | xargs --null -n1 tar -xvf
Но я не верю, что деготь вмещает несколько tar-файлов из stdin, как в OP ...
Я не думаю, что ваш вопрос задает правильный вопрос. Ваш пример «подобный» на самом деле не будет открывать файлы из каталога.