3

У меня проблема с доступом к файлу в Linux Mint. Причина, очевидно, в том, что в имени файла не распознаются символы, но ни один из известных мне методов не помог мне переименовать его.

Итак, вот подробности: имя файла что-то вроде:

êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3

или, по крайней мере, так показывает мой файловый менеджер и терминал.

Я не могу открыть файл с любой программой, которую я использую под Linux Mint. медиаплееры и т.д ...

Его нельзя переименовать, переместить или скопировать через файловый менеджер. Все эти операции создают сообщения об ошибках, подобные этим:

(для переименования):

Error renaming file: No such file or directory.

(для копирования / перемещения):

No such file or directory.

Я также попытался переименовать команду из терминала, используя подстановочные знаки. Команда правильно выбирает имя файла, но не может копировать, вот вывод:

cp *0_7-_* 1.mp3
cp: cannot open `êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3' for reading: No such file or directory

Я также пытался использовать команду mv,

mv *0_7-_* 1.mp3
mv: cannot move `êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3' to `1.mp3': No such file or directory

Если я попытаюсь переименовать sudo, я получу:

Unrecognized character \xC3; marked by <-- HERE after <-- HERE near column 1 at (eval 1) line 1.

Сам файл является действительным файлом MP3. Он может быть открыт Windows Media Player под XP.

Проблема в том, что у меня большая музыкальная библиотека (более 100 Гб), и несколько десятков похожих файлов с недопустимыми символами в именах. Я не хочу терять эти файлы, и я хотел бы выяснить, как справиться с такими ситуациями в будущем (предпочтительно в Linux, потому что у меня нет компьютера, на котором работает Windows).

Любая помощь будет оценена

ОБНОВЛЕНИЕ: в соответствии с просьбой Тердона, вот выход locale:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

ОБНОВЛЕНИЕ 2 Я только что проверил с моим компьютером друзей XP. И я могу подтвердить следующие выводы. Исходный файл может быть воспроизведен проигрывателем Windows Media, но не может быть воспроизведен Winamp. Однако после доступа и переименования его через файловый менеджер он воспроизводится обоими игроками.

Таким образом , я делаю вывод , что это проблема с непризнанным характером. Я все еще интересуюсь решением под Linux, хотя,

2 ответа2

2

Четыре вещи:

Попробуйте дополнение решения - переместите все остальное, затем удалите все.

mkdir ../everything_else
mv problematic/folder/path/* everything_else
sudo rm -rf problematic/folder/path

Убедитесь, что в файле нет ACL, и удалите все, что может вызвать проблемы:

$ /bin/ls -le problematic/folder/path
total 16
-rw-r--r--+ 1 whmcclos  staff  1918 Dec 18 09:00 README
0: user:_spotlight inherited allow read,execute,readattr,readextattr,readsecurity
$ chmod -a "..."

Попробуйте сценарий Perl, чтобы сгладить зависимости имен OS/FS?

Например, что-то похожее на этот фрагмент кода - сохраняйте имя файла в анонимном $ _:

$ mkdir fred; cd fred; touch a b c d e f
$ cat > try.pl
#!/usr/bin/perl
opendir(D,".") or die "cannot open .\n";
@files=readdir(D);
closedir(D);
foreach (@files) {
  next if /\.{1,2}/;                      # Skip directory entries
  print; print "? "; $r = <>; chop($r);   # Provide some level of control
  if($r eq "y" or $r eq "Y") {unlink;}    # Should report if cannot unlink unnamed file - tbd.
}
^D
$ /usr/bin/perl try.pl
a? 
b? 
c? y
d? 
e? 
f? 
$ ls
a       b       d       e       f       try.pl

[Обновлено, чтобы отразить первоначальное намерение авторов - скопировать зверя в файл с хорошим поведением (имя):]

Чтобы увидеть, может ли Perl скопировать неправильно поступивший файл в файл с хорошим поведением, я бы использовал приведенный ниже сценарий Perl - по-прежнему в соответствии с вышеприведенным - пусть Perl "анонимно" обращается к имени файла.

(Кроме того, ACL должен быть действительно проверен; ACL может даже препятствовать тому, чтобы root нормально обращался к файлу как root, насколько я помню, имел дело.]

Вот скрипт Perl:

$ cat try3.pl
#!/usr/bin/perl
# A code fragment to ask to copy a displayed file to $TO; chg $TO on next line:
$TO="my_new_behaved_filename";       # This is the name that will be copied to
opendir(D,".") or die "cannot open .\n";
@files=readdir(D);
closedir(D);
foreach $f (@files) {
  next if $f =~ /\.{1,2}/;           # Skip directory entries, "." & ".."
  print "$f? "; $r = <>; chop($r);   # Provide some level of control; "y" or "Y"
  if($r eq "y" or $r eq "Y") {       #   to copy the displayed filename to $TO
    print "copying it to $TO...\n";
    # Now, see if we can copy the darn thing to $TO:
    open(FROM,$f) or die "sorry - couldn't open it...";
    open(TO,">$TO");
    while(read FROM, $buf, 16384) {
      print TO $buf;
    }
    close(TO);
    close(FROM);
  }
}

Что бы вы использовали как таковой, предполагая, что try3.pl является вышеупомянутым скриптом Perl:

$ ./try3.pl 
a? 
b? 
d? y
copying it to my_new_behaved_filename...
e? 
f? 

Получите доступ к файлу через символическую или жесткую ссылку и посмотрите, какой пробег вы получите.

Я бы использовал расширение имени файла [tab] в vi, чтобы попытаться "определить" оболочке, на какой файл вы хотите сослаться.

Я отодвинул ~/{. Vim, .viminfo, .vimrc} в сторону, чтобы ограничить такие вещи, как ввод в wildmenu. Вы можете сделать то же самое.

Теперь удалите следующую последовательность командной строки в папке, содержащей фиктивный файл:

$ vi

В vi введите именно эту последовательность символов

!!ln -s [tab]

Таким образом, эта последовательность клавиш была прописью: восклицательный знак, восклицательный знак, el, en, пробел, тире, es, пробел, таб. Как только вы нажмете клавишу [tab], первый файл текущего рабочего каталога должен отобразиться после пустого символа (после "s") в строке состояния vi. Нажмите клавишу [tab] несколько раз, чтобы перейти к поддельному имени файла. Когда появится поддельное имя файла, нажмите пробел, чтобы добавить пробел, а затем введите новый файл / имя ссылки.

Результат в строке состояния vi должен выглядеть примерно так

!!ln -s bogus_filename new_sym_link_name

Нажмите клавишу возврата, чтобы увидеть, будет ли команда link (порожденная из vi заменять текущую нулевую строку в пустом буфере vi, о чем нам здесь наплевать; нам нужен побочный эффект выполнения команды оболочки с расширением tab) создать ссылку, new_sym_link_name.

Выйдите из vi с помощью:q! [Return]и посмотрите, сможете ли вы получить доступ к вашему файлу по символической ссылке.

(Вы также можете попробовать жесткую ссылку, пропустив -s в приведенной выше команде ln.

Поскольку я только что заметил, что вы можете изменить имя файла через Windows, я думаю, что каким-то образом в строку имени файла попала последовательность перевода строки с возвратом каретки, и это путает различные подходы.

1

Используйте ls -li чтобы получить номер инода рассматриваемого файла. Запишите номер индекса (первое поле). Я буду использовать 123456 в качестве примера.

Затем используйте find для удаления файла:

find -inum 123456 -exec rm {} \;

или переименовать его:

find -inum 123456 -exec mv {} some_better_filename \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .