Нераспознанный символ в имени файла (linux)

у меня проблема с доступом к файлу в 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 переименовать затем я get:

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

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

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

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

обновление:
по просьбе terdon, вот outout о 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.
Однако в связи с переименованием через файлменеджер в нее играют оба игрока.

Итак, я заключаю, что это is a проблема с нераспознанным персонажем. Я все еще заинтересован в решении под linux, хотя,

3
задан Art Gertner
29.11.2022 17:11 Количество просмотров материала 2421
Распечатать страницу

2 ответа

четыре вещи:

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

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

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

$ /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, чтобы попытаться "идентифицировать"оболочку, на какой файл вы хотите связать.

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

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

$ vi

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

!!ln -s [tab]

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

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

!!ln -s bogus_filename new_sym_link_name

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

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

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

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

2
отвечен Billy McCloskey 2022-12-01 00:59

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

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

find -inum 123456 -exec rm {} \;

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

find -inum 123456 -exec mv {} some_better_filename \;
1
отвечен user285227 2022-12-01 03:16

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх