На этот вопрос уже есть ответ здесь:
Я настраивал облачный сервер и увидел, что случайно добавил папку с именем ^ [[4 ~
(с escape-кодом).Я хочу посмотреть, что внутри, и если это была ошибка, удалите этот каталог. Однако я не могу cd
или ls
содержимое. Я попытался найти escape-код, чтобы ввести команду типа cd \ x1b [30m;
и надеяться, что это приведет меня в каталог.
Что, если бы я был cd
или удалил его, выполнив поиск по первому каталогу, указанному с помощью ls
. Возможно ли это? Потому что, когда я выполняю ls | grep 4
, появляются два результата, и один из них - тот, к которому я пытаюсь получить доступ.
Решением может быть обнаружение имени папки в escape-строке или изменение каталога на первый каталог, который находит ls
. Как мне подойти к этой проблеме?
Забавный способ справиться с этим, используя 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
, чтобы не перезаписывать существующий файл. Все эти команды достаточно безопасны, если вы используете их так, как я их напечатал.
Удачи!
Узнайте, какой каталог называется экранированным:
$ ls -b
# \033[4~
Удалить с помощью:
rmdir -v `echo -e "\033[4~"`
Попробуйте использовать цитаты.
cd "\x1b[30m;"
Я не знаю, работает ли это на специальные символы также, но стоит дать ему попытку. Попытайтесь работать
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}
- строка thLineNumber:FolderName
, cut -d: -f2
выборы только FolderName
ls $( ..command.. )
использует вывод ..command..
как аргумент ls