Eu nunca faria isso sozinho, mas as pessoas com máquinas Windows insistem em colocar espaços nos nomes dos arquivos.
Eu compus este comando detalhado que funciona perfeitamente, exceto para os arquivos com espaços neles. Já tentei de tudo, aspas simples, aspas duplas, carrapatos, escape com barra invertida.
O comando deve copiar tudo de um diretório com determinadas extensões de arquivo, exceto uma lista de arquivos que não quero copiar. Infelizmente, alguns desses arquivos contêm espaços. Este é o comando:
cp $(ls *.txt *.docx | grep --invert-match --fixed-strings \
-e not_this_one.txt \
-e not_this_one_either.docx \
-e "no not me.txt" \
-e "please leave me out as well.docx") ./destination_directory/
Alguma ideia de como fazer isso funcionar?
Use
find
exargs
em vez de$(...)
expansão de parâmetro:Usamos a
-prune
opção para excluir coisas que não queremos copiar.Usamos
-print0
no comando find para produzir nomes de arquivos terminados em NUL, que quando canalizados paraxargs -0
manipular corretamente nomes de arquivos que contêm espaços em branco.Finalmente, usamos a
-t <target_directory>
opção oncp
porque isso permitexargs
apenas anexar uma lista de nomes de arquivos ao comando (sem o-t
, o diretório de destino precisa vir por último, o que complica um pouco as coisas).Ou, use
tar
:(E, claro, você pode colocar sua lista de padrões de exclusão em um arquivo e usar
--exclude-from
em vez disso.)Uma vez que você envia
ls *.txt *.docx
tru a pipe|
, o shell está gerando uma string onde os arquivos não são separados. Bem, eles podem ser separados por espaços (ou novas linhas), o que leva à confusão da próxima ferramenta que tenta usar esses nomes de arquivos de divisão de strings em espaços (ou novas linhas).Como você está marcando a pergunta com o bash, a expansão dos globs
*.txt
e*.docx
é feita pelo shell (bash), e o bash é capaz de rejeitar alguns padrões de arquivo fornecidos no GLOBIGNORE, você pode simplesmente fazer:O
(...)
aqui é para garantir que a configuração de GLOBIGNORE seja apagada assim que o subshell for fechado. Claro, você pode removê-lo e fazer umunset GLOBIGNORE
depois. O eco está lá para mostrar o resultado do comando. Se estiver satisfeito com o que obtém, remova o eco.