Linux, как мне поместить двойные кавычки вокруг файла перед передачей его в tar? - PullRequest
4 голосов
/ 17 декабря 2008

Я использую ls для получения моего имени файла, в котором есть пробел, поэтому оно выглядит примерно так:

my file with whitespace.tar.bz2

Я хочу передать это tar так:

ls | grep mysearchstring | tar xvjf

Как вставить двойные кавычки перед тем, как отправлять их в tar?

Ответы [ 2 ]

7 голосов
/ 17 декабря 2008

Хороший инструмент для этого - find и xargs. Например, вы можете использовать:

find . -name '*.tar.bz2' -print0 | xargs -0 -n1 tar xjf

Как предположил pixelbeat, вы также можете использовать оболочку следующим образом:

for archive in *.tar.bz2; do tar xvjf "$archive"; done
0 голосов
/ 17 декабря 2008

Что не так с расширением оболочки-подстановки? (Предполагается, что есть только одно имя файла.)

% 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 ...

...