Eu tenho uma variável com caminho para folder1
conter um espaço em branco:
TEST=path/with\ space/to/folder1/
Quero concatenar todos os arquivos dentro de um folder1
with cat
mas dá um erro:
cat "$TEST"* > test
cat: path/with: No such file or directory
cat: 'space/to/folder1/*': No such file or directory
Quando tento fazer isso diretamente, cat path/with\ space/to/folder1/ > test
funciona.
Além disso, funciona com aspas duplas:
TEST="path/with space/to/folder1/"
cat "$TEST" > total
Mas como fazer isso direto no \
caminho?
Eu usaria
find
com sua-exec
opção para isso. Por exemplo:A
-maxdepth 1
opção evita a recursão em subdiretórios abaixo de "$TEST". Você pode alterar ou remover isso conforme necessário.-type f
corresponde apenas a arquivos regulares (ou seja, exclui diretórios, pipes nomeados, links simbólicos, etc).Se você quiser que ele corresponda a padrões de nome de arquivo específicos, você pode usar as opções
-name
ou (por exemplo ) ou o / .-regex
-name '*.txt'
-iname
-iregex
find
tem muito mais opções e é muito flexível - mas também é muito complexo e leva tempo e esforço para aprender tudo o que é capaz. O esforço vale a pena, no entanto. Leia a página do manual e pratique :-)Uma coisa que vale a pena notar é que
find
os predicados de 's são agrupados por AND por padrão. O que isso significa é que, se você tiver,-name '*.txt' -name '*.csv'
ele tentará corresponder aos arquivos que terminam em .txt e .csv ao mesmo tempo (o que é impossível, portanto não corresponderá a nada). Para OR os predicados, você precisaria fazer algo como:Isso corresponderá aos arquivos que terminam em .txt ou .csv. Os predicados com OR estão entre parênteses para agrupá-los, assim como na aritmética. A linha inteira é lida como "encontre arquivos no diretório $TEST até uma profundidade máxima de 1 que sejam arquivos regulares E (com nomes terminando em .txt OU .csv) E execute cat neles. Redirecione a saída para um arquivo chamado teste"
Também vale a pena notar: O
{}
é um espaço reservado para o(s) nome(s) do(s) arquivo(s) na-exec
opção. E+
no final da-exec
opção dizfind
para caber tantos nomes de arquivos quanto possível em cada linha de comando (para que seja executadocat
o menor número de vezes possível). O limite é ARG_MAX , cerca de 2 milhões de bytes em um sistema Linux moderno.Você também pode usar
\;
em vez de+
- isso dizfind
para executarcat
UMA VEZ por nome de arquivo (portanto, será muito mais lento, mas às vezes ter apenas um nome de arquivo por execução é exatamente o que você precisa. Outras vezes, uma execução em massa com+
é a coisa certa).