Как получить доступ / удалить папку, случайно названную с помощью экранированных символов? [дубликат]

На этот вопрос уже есть ответ здесь:

Я настраивал облачный сервер и увидел, что случайно добавил папку с именем ^ [[4 ~ (с escape-кодом).Я хочу посмотреть, что внутри, и если это была ошибка, удалите этот каталог. Однако я не могу cd или ls содержимое. Я попытался найти escape-код, чтобы ввести команду типа cd \ x1b [30m; и надеяться, что это приведет меня в каталог.

Что, если бы я был cd или удалил его, выполнив поиск по первому каталогу, указанному с помощью ls . Возможно ли это? Потому что, когда я выполняю ls | grep 4 , появляются два результата, и один из них - тот, к которому я пытаюсь получить доступ.

Решением может быть обнаружение имени папки в escape-строке или изменение каталога на первый каталог, который находит ls . Как мне подойти к этой проблеме?

0
задан 6 October 2013 в 22:31

4 ответа

Забавный способ справиться с этим, используя Bash: cd в каталог (это легко).

Затем мы проверим, что в имени файла находится управляющий символ: если вы введете

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

, вы должны увидеть там свой файл. Если нет, попробуйте использовать другой класс символов или измените глобус так, чтобы он соответствовал имени вашего файла. (Но, скорее всего, у вас будет только странный вариант.) Тогда возможны три варианта:

  • Предыдущая команда выдала только ваш странный файл. Затем, просто, просто переименуйте его:

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

    готово!

  • Предыдущая команда выдала несколько имен файлов с причудливыми именами. Затем переименуйте их все как:

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

    готово!

  • Предыдущая команда выдает несколько имен, но вы хотите изменить только одно. В этом случае мы поместим их все в массив, распечатаем их все с номером впереди, а затем выберем только тот, который нам нужен:

    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
    

    готово!

Примечание. Если вы используете эти команды, убедитесь, что вы используете их с правильными цитатами (т. Е. Цитатами, которые я дал). Не изменяйте цитаты!

Замечание. Вы, скорее всего, захотите сначала выпустить mv, который я дал с echo впереди, просто чтобы посмотреть, что он будет делать, например,

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

и удалить echo, когда вы Вы счастливы с этим! В любом случае, я использую переключатель -n, чтобы не перезаписывать существующий файл. Все эти команды достаточно безопасны, если вы используете их так, как я их напечатал.

Удачи!

0
ответ дан 6 October 2013 в 22:31
  1. Узнайте, какой каталог называется экранированным:

    $ ls -b
    # \033[4~
    
  2. Удалить с помощью:

    rmdir -v `echo -e "\033[4~"`
    
0
ответ дан 6 October 2013 в 22:31

Попробуйте использовать цитаты.

cd "\x1b[30m;"

0
ответ дан 6 October 2013 в 22:31

Я не знаю, работает ли это на специальные символы также, но стоит дать ему попытку. Попытайтесь работать

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

в родительской папке; это печатает все его каталоги, которым предшествует число и двоеточие : (что-то как 1:folder1 2:folder2 ...). Найдите число, соответствующее Вашей папке, и затем выполните следующую строку (замена ${num} с числом)

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

или возможно с кавычками:

cd "$(ls -d */ | grep -n '' | grep ^${num}: | cut -d: -f2)"
  • ls -d */ списки все каталоги
  • grep -n "" соответствия все строки, содержащие "", т.е. все и опция -n перечисляет каждого
  • grep "^${num}:" печать только ${num}- строка th
  • так как строка - что-то как LineNumber:FolderName, cut -d: -f2 выборы только FolderName
  • ls $( ..command.. ) использует вывод ..command.. как аргумент ls
0
ответ дан 6 October 2013 в 22:31

Другие вопросы по тегам:

Похожие вопросы: