Eu fiz um erro de digitação:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
Agora eu tenho um arquivo que se chama ^C (ctrl+C)!! Quando uso ls
, vejo apenas um ponto de interrogação (provavelmente devido à localidade?)
% ls -al
total 60
drwxr-xr-x 2 root wheel 512 Jan 21 09:35 ? <- this one
drwxr-xr-x 5 admin wheel 512 Jan 21 16:24 .
drwxr-xr-x 3 root wheel 512 Jan 20 14:29 ..
-rw-r--r-- 1 admin nobody 1114 Jan 20 19:10 .cshrc
-rw------- 1 admin wheel 6002 Jan 21 15:27 .history
-rw-r--r-- 1 admin nobody 182 Jan 20 14:29 .login
-rw-r--r-- 1 admin nobody 91 Jan 20 14:29 .login_conf
-rw------- 1 admin nobody 301 Jan 20 14:29 .mail_aliases
-rw-r--r-- 1 admin nobody 271 Jan 20 19:04 .mailrc
-rw-r--r-- 1 admin nobody 726 Jan 20 19:05 .profile
-rw------- 1 admin nobody 212 Jan 20 14:29 .rhosts
-rw-r--r-- 1 admin nobody 911 Jan 20 19:06 .shrc
drwx------ 2 admin nobody 512 Jan 20 15:05 .ssh
drwxr-xr-x 2 admin wheel 512 Jan 20 19:08 bin
e
% ls -i
3611537 ? 3611534 bin
Eu quero remover este arquivo. Eu tento mv
e ao usar tab-completion ele me mostra:
% mv
^C/ bin/
Obviamente não consigo digitar um ^C :-/ Como removo este arquivo?
^V
( ctrl+ v) funciona como uma espécie de seqüência de escape para o próximo pressionamento de tecla, inserindo o valor associado em vez de executar qualquer ação que normalmente estaria associada.Fazendo uso disso,
^V^C
( ctrl+ v, ctrl+ c) deve funcionar para inserir seu nome de arquivo difícil no terminal.Você também pode remover o arquivo por inode:
Faça o que fizer, pelo amor de Deus, não coloque
-delete
antes-inum
:Parabéns, você acabou de apagar todos os seus arquivos. Com
find
, a ordem dos argumentos é importante !Outra opção é usar
rm -ri ./*
;rm
perguntará antes de excluir qualquer arquivo e diretório, então você só precisa respondery
ao arquivo "ruim" en
a todos os outros.Na verdade, no seu caso, você pode até reduzir o número de respostas necessárias fazendo
rm -ri ./?
, já que seu arquivo "ruim" tem apenas um caractere.Uma opção é procurar o nome do arquivo com algo diferente de
ls
. Se você sabe que foi produzido por um verbatim Ctrl+ C, você pode encontrar o caractere ASCII produzido usando uma tabela de caracteres de controle ou com uma interface mais amigável como a fornecida pelo Python:Outra opção seria olhar para um dump hexadecimal da saída de
ls
, usando, por exemplo,hexdump
.Então você pode excluir o arquivo com (por exemplo) este comando bash:
(As aspas duplas são necessárias apenas se o caractere que você está tentando imprimir estiver em sua
IFS
variável, como\x20
ou\x0A
, mas é um bom hábito citar substituições de comando, a menos que você saiba que deseja que o shell execute a divisão de campo etc.)Muitas vezes, nesse tipo de situação, é fácil encontrar um padrão curinga que corresponda ao arquivo relevante.
No seu caso, isso seria simples
?
(combinando todos os nomes de arquivos com exatamente um caractere).Basta verificar se realmente corresponde ao que você deseja:
E, em seguida, remova o diretório:
Você também pode combinar isso com a conclusão de tabulação . Você pode digitar
e pressione tab, e por exemplo no bash será substituído por
e você pode pressionar enter e ele faz o que você deseja.
Você pode usar o Midnight Commander (mc) para excluir o arquivo - basta selecionar com os botões para cima/para baixo e pressionar F8.
Eu fiz isso ocasionalmente quando os nomes dos arquivos tinham caracteres estranhos devido à codificação.
Ainda outra maneira: use
stat
para obter uma representação com escape do nome do diretório:Agora você conhece uma representação do nome do arquivo, então você pode remover o arquivo pelo nome usando
printf
:Ou, se você estiver usando o bash, poderá evitar
printf
:Uma solução que funcionou para mim é:
para percorrer os arquivos disponíveis até encontrar o que quero remover.
Mas você precisa ter as configurações necessárias em seu shell para que isso funcione.
A maneira mais fácil é mover tudo para o diretório temporário e depois
rm -r DIRNAME
.Se for o único diretório vazio (ou você não se importa em remover outros diretórios vazios), use
rmdir */
. Você receberá mensagens de errormdir
sobre não poder remover diretórios não vazios, mas tudo bem. GNUrmdir
suporta--ignore-fail-on-non-empty
, ou você poderia2>/dev/null
.O à direita
/
faz com que o glob corresponda apenas aos nomes de diretório.Você pode verificar antecipadamente quais diretórios vazios existem no atual usando
find -maxdepth 1 -type d -empty -ls
. (E você pode alterar o-ls
para-delete
se quiser).Você pode usar uma expressão glob mais específica, como
rmdir [^A-Za-z0-9._]/
para corresponder a diretórios que começam com um nome de arquivo não alfanumérico ou sublinhado. Eu também incluí.
, mas as expressões glob não correspondem.
normalmente de qualquer maneira.Como outros apontaram, você pode limitá-lo a nomes de caractere único com um glob de
?
:rmdir ?/
rmdir
não tem uma-i
opção comorm
tem, presumivelmente porque diretórios vazios geralmente não são valiosos e podem ser recriados.