(Android)Как изменить кодировку названия файлов, чтобы удалить их?
Скачал zip-файл, распаковал его в андроиде, а в zip'е есть файлы с названием по типу �� ���ᡫ��� �����.html, удалить которые не получается.
Файловый Менеджер и termux при попытке удаления пишут, что файла с таким именем нет, при этом, что странно, редактировать содержимое этих файлов и в менеджере файлов, и в термуксе(vim) я могу.
Есть подозрение, что имя файла в windows-кодировке(файл для windows, скорее всего), которую андроид не распознаёт, но, другие файлы в zip'е имели нормальные имена.
На пк(GNU/Linux) adb тоже пишет, что нет таких файлов.
В интернете пишут, что нужно использовать iconv, но я находил примеры для перекодировки содержимого файла, а примеров с перекодировкой имени файла и заменой им предыдущего файла с нераспознанной кодировкой я не находил.
Или можно обойтись какой-нибудь простой C-программкой и из-под термукс удалить эти файлы?
Я не знаю, можно ли здесь приводить ссылку на zip-файл, вдруг это вирус.
Роберт, еще в термуксе есть кнопка "таб", которая сама добавляет "предложение"
Можешь попробовать ввести rm *пробел* и нажать кнопка таб (у меня она помечена как 2 горизонтальные стрелки в разные стороны)
Долго пытался вспомнить, как сам удалял файл со странным названием в линуксе, где ни проводник, ни консоль не могла помочь. Правда это было на компе, но вдруг тебе на телефоне поможет.
Попробуй удалить файл через mc. Установи его в термуксе и запусти
файлы с неправильными именами удаляют с помощью find (этот баг в rm уже лет 100)
сначала удостоверься что удалится то что ты хочешь find *html
выведет список файлов find *html -delete
добавить -type f чтобы только файлы, там еще тьма опций
Предлагаю еще одну попытку, с помощью ls -i выводим имена файлов с их номерами inode в файловой системе, разбираем этот список и для каждого вызываем find -inum номер:
вообще это странно, я бы конечно попробовал удалить файл из какого-нибудь python/c++/php/... что угодно, работающее нативно с файлами а не как bash через ж...
rPman, на C пытался с remove(), не получилось. Или через файловый дескриптор? Вообще есть идея, что С должен стереть определённый блок памяти, занимаемый файлами, не обращая внимания на имя файла. Или это только asm могут?
maksam07, у меня легкое сомнение, а не порушена ли у тебя файловая система, можешь запустить fsck на этот диск? (если он системный, то потребуется перезагрузка, а так просто отмонтировать)
офигеть!
ну у меня для вас хорошие новости, удаляйте termux и android вместе с ним удалит весь мусор что хранится там
ВАЖНО! забакапь важные данные из termux!
на сколько я знаю он хранит файлы в приватном хранилище приложения, которое удаляется безвозвратно при удалении приложения
Роберт, встроенная это не карта а грубо говоря ssd
карта памяти это то что можно извлечь (она в виде 'карточки' такой с ноготок)
p.s. еще одно предложение - попробуй ПЕРЕИМЕНОВАТЬ сбойные файл по одному в total commander во что то нейтральное, например 1, 2, 3,...
у меня есть теория, что подобное происходит потому что в ядре android linux не вкомпилирована поддержка локалей или что то в этой окрестности (оооочень очень давно, если в gentoo играть с компиляцией ядра и что то критичное не добавить, связанное с однобайтовыми кодировками, была проблема с работой с криво названными файлами, созданными с помощью samba, тогда еще не умеющей корректно работать с именами в виндовой кодировке)... так вот, если я прав, то такие файлы не сможет удалить и android сам и собственно жить вам с этими файлами до конца (но можно переместить каталог, в котором они лежат в куда-нибудь по дальше)
неа, mv работает с именами так же коряво как и rm и куча других утилит
собственно find должен был все исправить, и уж тем более python код, если они не справились то вариантов вообще то не густо
p.s. О_о vim открывает файл!? я вообще в шоке
что творится
я ничего не понимаю тогда!
НО! если vim может, тогда нужно написать программу на c++ и ею удалить файл ;) ключевое слово, надо разобраться, что в vim позволяет это делать и повторить
rPman, я делал ставку на утилиту mc. Она меня когда-то спасла от какого-то сбоя на линуксе и файл тоже никак не хотел удаляться, но и тут эта утилита бессильна..
может, это из-за того, что термуксовский mc не такой, как на пк
визуально вроде похожи, но кто знает, что там под капотом. Ну а т.к. не сработали и другие методы для удаления файлов, то не факт, что mc отличается, возможно просто проблема серьезнее
Роберт, давайте попробуем удалить через программы Solid Explorer или FX File Explorer, это очень маловероятно, но вдруг. Иначе, я бы уже действительно задумывался над тем, что необходимо отформатировать память. Кстати, можно еще в программах попробовать удалить не файл, а папку, в которой находится этот файл - вдруг прокатит.
так как я плохо знаю linux api, я по всякому пообщался с gpt4 (вот чудо то какое, раньше гуглить до посинения приходилось) так вот, нет в linux способа удалять файл без указания его имени
rPman, проблема в том, что, как я понимаю, Android не даёт выполняться c++-бинарнику из Android-директории, то есть, ./main будет работать только в термуксовой ФС
rPman, тогда нужно указать путь до директории, типа: ./main ~/storage/shared/Download/game/cs1.6/maps/f
А так ./main удаляет всё в настоящей директории.
rPman, Пишет, что файл такой-то удалён, но не удаляет.
Кстати, вместо строки можно же argv[1] использовать, тогда в main вписать нужно main(int argc, char *argv[]) и в терминале ./main /путь/к/директории
Я всё же склоняюсь к тому, что если юзать С или С++, то нужно узнать адрес памяти той злополучной директории и хардкордно зачистить её, но не знаю, как реализовать. Да и метод такой небезопасный(и андроид может запретить выполнение), тогда нужно сделать бекап данных на другое устройство как минимум.
Можно ещё юзать asm, но я надеюсь, что это излишне.
maksam07, ПОЛУЧИЛОСЬ! По отдельности он не удалял, а директорию он удалил(То ли я сразу удалил, или сначала переместил в корзину, а потом очистил её)
p.s:Было бы интересно посмотреть в исходниках, как он это делает, может быть, он как-то переместил директорию с файлами к себе в кэш и очистил его?
Роберт, в Андроиде много загадок) сам не знаю ответа на этот вопрос, но определенно рад, что такая не лёгкая дискуссия помогла решить вопрос.
На это приложение, кстати, случайно нашел. Читал недавно какие-то материалы по телефонам и как-то наткнулся на это название аля "хороший чистильщик". Дай, думаю, предложу попробовать)
maksam07, рано я радовался. Файловый менеджер+ только переместил директорию с файлами в /sdcard/.$recycle_bin$/dir, причём, скопировать файлы получилось и другим проводником, в итоге - у меня есть дубликаты злополучных файлов(замена с переименованием не прокатила).
Вот если б этот файловый менеджер+ переместил директорию с файлами на что-то типа /dev/null, но андроид может запретить.
Роберт, но ведь файл переместился, а не скопировался? То есть получилось изменить его место хранения? Там где ты изначально его пытался удалить, его уже больше нет, верно?
Роберт, если файлы или папку с файлами можно перемещать, то можно попробовать воспользоваться другими файловыми менеджерами, который, к примеру, имеют свою корзину и могут ее очищать. Я правда не знаю, очистка корзины происходит каким-то особым методом или так же, как и обычное удаление файла, но можно попробовать в папку "корзины" перемещать эти файлы и попытаться чистить корзину. вдруг какой-то менеджер сможет ее очистить в ноль
maksam07, стоит ли реализовывать свою корзину(сделать какую-нибудь программку под термукс/андроид-ndk), или это не стоит того? Потому что я думаю, что большинство ФМ реализованы схоже между собой.
p.s: APK с ndk собрать могу, с этим, скорее всего, проблем не будет.
Роберт, учитывая опыт этой темы, мне уже сложно что-то рекомендовать вам. У вас по какой-то причине не работает ни один из "хороших" вариантов. Кстати, предоставьте больше информации о телефоне: марка-модель, версия андрода, информация о прошивке
Роберт, можно попробовать обновить прошивку до конца. Там кажись уже даже андроид 13 может быть доступен с RUI 4.0, вдруг там какие-то исправления есть.
Или попытать совета на форуме: https://4pda.to/forum/index.php?showtopic=1054880
Роберт, не обязательно сейчас. Как найдешь интернет получше - попробуй. Если дома плохой, то может где-то в кафе или другом заведении. А пока интернета нет, можешь на форуме вопрос задать, вроде:
скачал и распаковал архив с файлами, часть имен на кириллице, их не получается удалить, ошибки "такие-то", что можно попробовать?
редактировать эти файлы и в Менеджере файлов, и в термуксе(vim) я могу
вот и удаляй их этими средствами
в zip нет стандарта на кодировку, и соответственно если кто то на windows запишет русские буквы с такой кодировкой, на linux так и будет...
вот полистай тему, там предлагают кучу методов как распаковать такие zip файлы
upd. 7z умеет работать с архивами с указанной кодировкой ключ -scsКОДИРОВКА, как распаковывать так и упаковывать, соответственно распаковывай, редактируй, упаковывай
7z умеет работать с архивами с указанной кодировкой ключ -scsКОДИРОВКА, как распаковывать так и упаковывать, соответственно распаковывай, редактируй, упаковывай
я честно не понимаю вопроса, а точнее твое непонимание
ты можешь ПОЛНОСТЬЮ распаковать архив, отредактировать файлы, удалить, переименовать, солздать новые, что угодно и создать НОВЫЙ архив из них, назови его как старый.
Редактирование архива это в любом случае его пересоздание (под капотом архиваторы именно это и делают)
Как ты редактируешь файлы? Та "программа", которая умеет открывать эти файлы, через свое "меню" не может выполнить операцию удаления или изменения имени?
maksam07, или открываю в файловом проводнике, или в termux(vim TAB)
Удалить не получается ничем. Или через vim можно удалить?
Как раз таки файлы *.sw* от vim'а
Психанул и снес свои ответы козлам, не отмечающим…
Нужно найти терминал или другую программу, не пытающуюся (неправильно) переводить прочитанные из ФС данные в UTF-8, а выводящую их в виде esc-последовательностей с кодами, как это делает Python, если не задать ему режим UTF-8. Тогда останется скопировать эти коды в команду rm. Можно ли задать 7-битную кодировку в termux, нечто вроде en_US.US-ASCII? Или тот же Python попробовать...
Может еще сработать способ с удалением файла не по имени, а через номер inode, если есть способ его узнать.