Como acessar / excluir uma pasta acidentalmente nomeada com caracteres de escape? [duplicado]

0

Eu estava configurando um servidor de nuvem e vi que acidentalmente adicionei uma pasta chamada ^[[4~ (com código de escape). Eu quero ver o que está dentro e se isso foi apenas um erro, remova esse diretório. No entanto, não posso cd nem ls do conteúdo. Eu tentei descobrir o código de escape para que eu pudesse inserir um comando como cd \x1b[30m; e esperar que ele me colocasse no diretório.

E se eu fosse cd ou removesse procurando o primeiro diretório listado com ls . Isso seria possível? Porque quando eu faço um ls |grep 4 dois resultados surgem e um deles é o que eu estou tentando acessar.

Descobrir o nome da pasta na string de escape ou alterar o diretório para o primeiro diretório ls finds pode ser uma solução aqui. Como posso abordar esse problema?

    
por Logan 06.10.2013 / 20:31

4 respostas

2

Uma maneira engraçada de lidar com isso, usando o Bash: cd no diretório (isso é fácil).

Em seguida, verificaremos se um caractere de controle está no nome do arquivo: se você emitir

printf 'strange: %s\n' *[[:cntrl:]]*

você deve ver seu arquivo lá. Se não, tente usar outra classe de caracteres ou modifique o glob para que corresponda ao seu nome de arquivo. (Mas muito provavelmente, você só terá o bizarro.) Então, três possibilidades:

  • O comando anterior apenas emitiu seu arquivo bizarro. Então, fácil, basta renomeá-lo:

    mv -nv *[[:cntrl:]]* a_less_bizarre_name
    

    feito!

  • O comando anterior emitiu vários nomes de arquivos com nomes bizarros. Em seguida, renomeie todos como:

    i=0
    for biz in *[[:cntrl:]]*; do
        mv -nv "$biz" a_less_bizarre_name$((++i))
    done
    

    feito!

  • O comando anterior gera vários nomes, mas você só quer alterar um. Neste caso, vamos colocá-los todos em uma matriz, imprimi-los todos com um número na frente e, em seguida, vamos selecionar apenas o que queremos:

    bizarre=( *[[:cntrl:]]* )
    for index in "${!bizarre[@]}"; do
        printf "%s --> %s\n" "$index" "${bizarre[index]}"
    done
    # Then, look at the index of the one you want to rename
    # If its index is 42, issue:
    mv -nv "${bizarre[42]}" a_less_bizarre_name
    

    feito!

Observação. Se você usar esses comandos, certifique-se de usá-los com as citações apropriadas (ou seja, as citações que eu dei). Não altere as citações!

Observação. É muito provável que você queira primeiro emitir o mv I com um echo na frente, apenas para ver o que ele fará, por exemplo,

echo mv -nv *[[:cntrl:]]* a_less_bizarre_name

e remova o echo quando estiver satisfeito com isso! De qualquer forma, estou usando a opção -n para não sobrescrever um arquivo existente. Todos esses comandos são bastante seguros se você usá-los como eu os digitei.

Boa sorte!

    
por gniourf_gniourf 06.10.2013 / 22:13
1
  1. Descubra o nome do diretório como escape:

    $ ls -b
    # 3[4~
    
  2. Remover por:

    rmdir -v 'echo -e "3[4~"'
    
por Logan 06.10.2013 / 20:56
0

Eu também não sei se funciona para caracteres especiais, mas vale a pena tentar. Tente executar

ls -d */ | grep -n "" | more

na pasta pai; isso imprime todos os diretórios precedidos por um número e os dois pontos : (algo como 1:folder1 2:folder2 ...). Encontre o número correspondente à sua pasta e, em seguida, execute a seguinte linha (substitua ${num} pelo número)

cd $(ls -d */ | grep -n "" | grep "^${num}:" | cut -d: -f2)

ou talvez com aspas:

cd "$(ls -d */ | grep -n '' | grep ^${num}: | cut -d: -f2)"
  • ls -d */ lista todos os diretórios
  • grep -n "" corresponde todas as linhas que contêm "" , ou seja, cada uma, e a opção -n enumera cada uma delas
  • grep "^${num}:" imprime apenas a ${num} -th line
  • porque a linha é algo como LineNumber:FolderName , cut -d: -f2 seleciona apenas FolderName
  • ls $( ..command.. ) usa a saída de ..command.. como argumento de ls
por AndreasT 08.10.2013 / 00:13
-1

Tente usar aspas.

cd "\x1b[30m;"

    
por Kevin C. Smith 06.10.2013 / 20:38