Recentemente, encontrei um arquivo cujo nome começa com o caractere '♫'. Eu queria copiar esse arquivo, alimentá-lo ffmpeg
e fazer referência a ele de várias outras maneiras no terminal. Normalmente, eu preencho automaticamente nomes de arquivos estranhos, mas isso falha, pois nem consigo digitar a primeira letra.
Não quero mudar para o mouse para executar uma manobra de copiar e colar. Não quero memorizar vários códigos para possíveis cenários. Minha solução ad hoc foi trocar vim
, colar !ls
e copiar o personagem em questão e sair e colar no terminal. Isso funcionou, mas é bastante horrível.
Existe uma maneira mais fácil de lidar com esses cenários?
NOTA: Estou usando a casca do peixe se ela mudar as coisas.
command-line
filenames
wildcards
special-characters
fish
ZirconCode
fonte
fonte
*restoffile.avi
ou algo parecido com isto?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Respostas:
Se o primeiro caractere do nome do arquivo for imprimível, mas não alfanumérico nem em branco, você pode usar o
[[:punct:]]
operador glob:fonte
O mais simples que me ocorre é
ls [^a-zA-Z0-9]*
e faz o truque para mim, mas a resposta de Terdon é melhor para chamar a atenção para a opção extglob shell ou mesmo para uma abordagem independente do shell.fonte
ls [^[:alnum:]]*
pela mesma coisa. Mas é melhor usar a classe de personagem que é , em vez das classes que não são ; portantols [[:punct:]]*
, listará esse arquivo.O ls possui algumas opções (como --quote-name, --escape, --literal) para lidar com caracteres não imprimíveis, mas, neste caso, parece que o personagem é "imprimível", mas não "tipificável" (pelo menos no meu teclado! ), portanto, nenhuma dessas opções parece ajudar.
Portanto, como uma abordagem geral de "força bruta" para se livrar de arquivos com caracteres em seus nomes, você pode fazer o seguinte:
Encontre a linha que contém o arquivo incorreto. Provavelmente será a primeira linha, mas digamos que seja a quinta. Imprima a linha 5 e codifique hexadecimalmente:
Ignorando o caractere 0a (nova linha), construa uma string de escape e use a opção -e de echo para traduzir os escapes:
Agora você pode copiar / mover / excluir da seguinte forma:
Além disso, se você não estiver confinado ao uso de shell script, poderá fazê-lo no Python assim:
Usando esta abordagem, você pode processar muitos arquivos, basta escrever a lógica para selecionar os arquivos corretos e renomeá-los sem bater de frente, etc:
fonte
Uma abordagem semelhante seria listar todos os arquivos que não começam com caracteres "normais". No bash, você pode fazer isso com
No entanto, isso não parece estar disponível
fish
, então você pode usarfind
:fonte
Renomear links simbólicos
Uma abordagem para lidar com nomes de arquivos com caracteres especiais - como primeiros caracteres ou em qualquer outra parte do nome do arquivo, é renomear para nomes mais simples .
Isso pode ser usado mesmo se você precisar manter os nomes de arquivos originais : Renomeie uma cópia dos nomes de arquivos.
Isso pode ser feito copiando os arquivos, mas também criando links simbólicos ou hardlinks para os arquivos e renomeá-los.
cp
cria links simbólicos em vez de cópias com a opção-s
(-l
para links físicos).Use "desintoxicação" para limpar nomes
Para renomear para limpar nomes de arquivos,
detox
pode ser usado; Ele renomeia os arquivos para limpar os nomes dos arquivos de acordo com várias regras, conforme definido em umdetoxrc
arquivo. Por padrão, os caracteres UTF8 são removidos; Com a opção,-s utf_8-only
eles são substituídos por_
:"desintoxicação" em links simbólicos
Combinado com o trabalho em links simbólicos, como descrito acima:
fonte
Não uso
fish
, mas a documentação diz que você pode inserir um caractere Unicode prefixando seu código de caractere hexadecimal por\u
(para caracteres de 16 bits) ou\U
(para caracteres de 32 bits). Eu acho que o código para♫
é491eb
, então você poderia fazer:renomear
♫abc.mp3
.Observe que você precisa dos zeros iniciais, caso contrário,
abc
no final, serão tratados como dígitos hexadecimais e parte do código de caractere; para um caractere de 32 bits, é necessário inserir 8 dígitos.fonte
Não sei se já era o caso em 2014 quando você fez a pergunta, mas nas versões atuais de
fish
(a partir de 2019), você pode pressionar Tabduas vezes para obter uma seleção no estilo zsh, na qual é possível usar as teclas de seta para selecione visualmente o arquivo desejado sem precisar digitar nenhuma parte do nome do arquivo.fonte
O Fish não suporta curingas de colchete ¹ por design.
O comando não pesquisa em diretórios e exibe escondidos nomes de arquivos que não comecem com os personagens
letters
,digits
,.
_
-
(cf a documentaçãofind
).Nota:
$argv
é uma variável de matriz especial (Fish shell) que contém os argumentos da função, portanto, o comando subjacente pode receber qualquer expressão (por exemplo, apelido ).¹ Na verdade, peixes suporta expansão suporte (expansão variável de matriz) mas Bash usa outra terminologia (parâmetro de nome de arquivo e expansões).
fonte
Use
zsh
e digite o que vem a seguir. O ZSH suporta auto-difusa e pode lidar com isso. (É especialmente interessante com o plug-in OH-MY-ZSH .)fonte
Você não disse se deseja manter esses nomes de arquivos problemáticos. Uma solução pode ser “corrigir” o problema de uma vez por todas renomeando (alguns ou todos) seus arquivos para nomes que você pode digitar executando este script:
Isso listará seus nomes de arquivos existentes, cada um seguido por
...?
. Basta digitar Enterpara deixar um arquivo como está; ou digite um novo nome para renomeá-lo. A-i
opção fará com que você solicite a confirmação da substituição, se você especificar o nome de outro arquivo existente.Este script pode ser modificado de várias maneiras:
*
) para algo mais restritivo, por exemplo*.avi *.mov
, para não precisar olhar para todos os arquivos.mv
paracp
, para manter uma cópia do arquivo com seu nome atual e criar uma cópia (temporária?) Com um nome digitável.Você pode criar um novo nome de arquivo baseado no nome do arquivo existente. Por exemplo,
que permite colocar um prefixo na frente do nome antigo. Se você escolher um prefixo exclusivo, isso permitirá que você complete automaticamente.
fonte