Eu cometi 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 chamado ^ 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 o preenchimento de guias, ele me mostra:
% mv
^C/ bin/
Obviamente não consigo digitar ^ C: - / Como removo este arquivo?
filesystems
freebsd
Mausy5043
fonte
fonte
dsw
não chegou ao POSIX.emacs -nw -f dired
fornece um navegador de diretório. <kbd> D </kbd> exclui o arquivo sob o cursor após a confirmação.Respostas:
^V
( ctrl+ v) funciona como um tipo de sequência de escape para o próximo pressionamento de tecla, inserindo o valor associado em vez de executar qualquer ação que normalmente seria associada.Fazendo uso disso,
^V^C
( ctrl+ v, ctrl+ c) deve funcionar para inserir seu nome de arquivo difícil no terminal.fonte
^V^C
se não trabalhar no editor de linha Zsh; o widget de inserção entre aspas (pesquise na página^V
) explicitamente não insere caracteres de interrupção. A resposta de Jakob (usando printf) pode ser uma maneira mais portátil de fornecer um caractere de controle em um argumento shell.Você também pode remover o arquivo por inode:
O que quer que você faça, 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 importa !fonte
-delete
antes-inum
? Isso é apenas uma precaução no caso de você pressionar Enter prematuramente ou a ordem dos argumentos realmente afeta o resultado?-delete
o comando, ponto final, até que você execute o comando sem-delete
verificar se ele está encontrando o que deseja.-print
vez de-delete
faz um teste muito bom.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
rm -ri ./?
, pois seu arquivo "ruim" tem apenas um caractere.fonte
select f in ?; do rm -i "$f"; break; done
tem todos os benefícios de-i
, sem a agonia de ter que responderno
a liderar indesejáveis ou responder erroneamente sim àquele que você deseja manter.rmdir ?/
removerá todos os diretórios vazios de um caractere e reclamará que os outros não estejam vazios.select
existia, muito legal!-r
(e./
- é sempre fácil esquecer) aos meus exemplos, pois infelizmentermdir
não suporta a-i
bandeira. Ainda assim, suponho que, neste caso, o melhor caminho a seguir seria uma combinação de bispo e seu comentário.select
existe apenas em alguns shells, e é provavelmente por isso que você não os encontrou - scripts e soluções que devem ser portáteis evitam-no, por isso é menos provável que o vejamos "em estado selvagem".Uma opção é procurar o nome do arquivo com algo diferente de
ls
. Se você souber que foi produzido por um verbatim Ctrl+ C, poderá 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 exemplohexdump
.Em seguida, 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 comandos, a menos que você saiba que deseja que o shell realize a divisão de campos etc.)fonte
cat -v
(maisman ascii
) pode ajudar na primeira parte.os.rmdir('\x03')
diretamente do shell Python.Geralmente, nesse tipo de situação, é fácil criar 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 da guia . 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 deseja.
fonte
Você pode usar o Midnight Commander (mc) para excluir o arquivo - basta selecionar com os botões para cima / para baixo e pressionar F8.
Fiz isso ocasionalmente quando os nomes de arquivos tinham caracteres estranhos devido à codificação.
fonte
Ainda de outra maneira: use
stat
para obter uma representação escapada do nome do diretório:Agora você conhece uma representação do nome do arquivo, para poder removê-lo pelo nome usando
printf
:Ou, se você estiver usando o bash, poderá evitar
printf
:fonte
$'\x03'
é mais simples do que chamar printf. O mesmo para o FreeBSD sh que é estendido sobre o shell POSIX com alguns recursos interessantes.$'...'
, mas evitaria a conversão inútil de octal para hexadecimal em geral. Por exemplo, e se o arquivo tiver sido nomeado'\111'
(nastat
saída)? Você ainda o removeria usando$'\x49'
? Melhor usar a mesma sequência questat
você forneceu: no caso do OPrmdir $'\003'
,.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 no seu shell para que isso funcione.
fonte
A maneira mais fácil é mover tudo para o diretório temporário e depois
rm -r DIRNAME
.fonte
^v
trabalhe consistentemente comigo há séculos.^V
precisam de um conhecimento específico, enquanto mover arquivos e a remoção do diretório pai pode ser derivada do básico.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 conseguir remover diretórios não vazios, mas tudo bem. O GNUrmdir
suporta--ignore-fail-on-non-empty
, ou você poderia2>/dev/null
.A trilha
/
faz com que o glob corresponda apenas aos nomes de diretório.Você pode verificar com antecedência quais diretórios vazios existem no diretório atual usando
find -maxdepth 1 -type d -empty -ls
. (E você pode mudar-ls
para-delete
se quiser).Você pode usar uma expressão glob mais específica como
rmdir [^A-Za-z0-9._]/
corresponder aos diretórios que começam com um nome de arquivo não alfanumérico ou sublinhado. Também incluí.
, mas as expressões glob não coincidem.
normalmente.Como outros já apontaram, você pode limitá-lo a nomes de caracteres únicos com um globo de
?
:rmdir ?/
rmdir
não tem uma-i
opção do jeito querm
tem, provavelmente porque diretórios vazios geralmente não são valiosos e podem ser recriados.fonte
rmdir
pode dizer se você passa a-v
opção para ele (pelo menos no GNU).find -maxdepth 1 -type d -empty -ls
Antes de fazer algo arriscado, tente primeiro:
Em geral - é um delimitador dizendo ao comando que não haverá opções, mas também permitirá que caracteres estranhos não sejam interpretados como outra coisa.
Outro exemplo de uso é
whois -r -- "-r OBJECT-RIPE"
(-r é um atalho para maduro, mas no maduro também é um parâmetro)
Se não funcionar na primeira tentativa, talvez tente
rmdir -- "^C"
Mas no meu shell csh não preciso disso, simplesmente
rmdir ^C
já funciona para mim.fonte
rmdir
seguida de <ctrl> C funciona? Realmente?! Eu esperaria que ele se comportasse de maneira diferente, ou seja, abortando ormdir
comando e retornando você à linha de comando.