Невозможно удалить / переместить файлы со специальными символами в имени файла

Как вы можете видеть ниже, файлы имеют необычные символы.

Удаление их либо в терминале, либо Dolphin возвращает ошибку:

Нет такого файла или каталог

Запуск ls -la в каталоге дал мне этот вывод:

-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ?? -rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F? -rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-?? -rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I??? -rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

Я запустил команду fsck в разделе из другой ОС, но он не изменился ничего.

Как удалить эти файлы?

16
задан 2 January 2018 в 13:53

6 ответов

Простым способом было бы удалить эти файлы с помощью inode. :)

Используйте ls -li в каталоге с необычными символами, чтобы показать номер inode каждого файла, например

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Затем используйте утилиту find для удалите соответствующий файл по его имени, используя синтаксис find <somepath> -inum <inode_number> -exec rm -i {} \;, как в следующем примере:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Опция -i для rm не нужна, я просто добавил ее в не позволяйте случайно удалять файлы, которые вы не хотели удалить. :) Это приводит к тому, что rm запрашивает подтверждение для каждого файла, который вы хотите удалить.

Если вы хотите удалить несколько файлов с помощью своих inodes, вы можете использовать синтаксис -o (значение или) для find:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

Вы можете добавить больше номеров inode, расширив выражение в круглых скобках с помощью выражений -o -inum <inode_number>.

34
ответ дан 22 May 2018 в 15:50
  • 1
    Как насчет rm -ri .? – Brent Baccala 30 December 2017 в 22:37
  • 2
    Это сработало: find & lt; somepath & gt; -inum & lt; inode_number & gt; -exec rm -i {} \; Что делает «-inum», «{}» и «\» в команде? – karjedavpalaa 30 December 2017 в 23:49
  • 3
    Как удалить несколько файлов за один раз? Кроме того, спасибо, ты сделал мой день! – karjedavpalaa 30 December 2017 в 23:51
  • 4
    Однако @BrentBaccala rm -ri . не удаляет файлы inode. Он просто перезагружается через весь рабочий каталог и запрашивает каждый файл, если вы хотите его удалить, и вы должны быть очень внимательны, какие файлы он запрашивает, чтобы случайно не удалять нежелательные. Я, конечно, не хотел бы использовать эту команду для моего домашнего каталога - она ​​содержит много файлов. ;) – Malte Skoruppa 31 December 2017 в 00:43
  • 5
    @karjedavpalaa (1) -inum сообщает find искать файлы по их номеру inode. (2) {} соответствует файлам, найденным grep. (3) \ экранирует символ ;, который завершает команду, переданную параметру -exec в find. (4) Я отредактировал свой ответ, чтобы объяснить, как удалить несколько файлов за один раз. – Malte Skoruppa 31 December 2017 в 00:54

Простым способом было бы удалить эти файлы с помощью inode. :)

Используйте ls -li в каталоге с необычными символами, чтобы показать номер inode каждого файла, например

$ ls -li total 0 133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F? 132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Затем используйте утилиту find для удалите соответствующий файл по его имени, используя синтаксис find <somepath> -inum <inode_number> -exec rm -i {} \;, как в следующем примере:

$ find . -inum 133370 -exec rm -i {} \; rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y $ ls -li total 0 132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Опция -i для rm не нужна, я просто добавил ее в не позволяйте случайно удалять файлы, которые вы не хотели удалить. :) Это приводит к тому, что rm запрашивает подтверждение для каждого файла, который вы хотите удалить.

Если вы хотите удалить несколько файлов с помощью своих inodes, вы можете использовать синтаксис -o (значение или) для find:

$ find . \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \; rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

Вы можете добавить больше номеров inode, расширив выражение в круглых скобках с помощью выражений -o -inum <inode_number>.

34
ответ дан 18 July 2018 в 00:11

Простым способом было бы удалить эти файлы с помощью inode. :)

Используйте ls -li в каталоге с необычными символами, чтобы показать номер inode каждого файла, например

$ ls -li total 0 133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F? 132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Затем используйте утилиту find для удалите соответствующий файл по его имени, используя синтаксис find <somepath> -inum <inode_number> -exec rm -i {} \;, как в следующем примере:

$ find . -inum 133370 -exec rm -i {} \; rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y $ ls -li total 0 132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Опция -i для rm не нужна, я просто добавил ее в не позволяйте случайно удалять файлы, которые вы не хотели удалить. :) Это приводит к тому, что rm запрашивает подтверждение для каждого файла, который вы хотите удалить.

Если вы хотите удалить несколько файлов с помощью своих inodes, вы можете использовать синтаксис -o (значение или) для find:

$ find . \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \; rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

Вы можете добавить больше номеров inode, расширив выражение в круглых скобках с помощью выражений -o -inum <inode_number>.

34
ответ дан 24 July 2018 в 17:10

Важно понимать, что это не относится к «повреждению файловой системы», с которым поможет fsck. Что касается файловой системы, имена файлов могут быть любой последовательностью байтов, если ни один байт не имеет значения 0x00 (ASCII NUL, C концевой маркер) или 0x2F (/, разделитель каталога) , (Если имя файла каким-то образом получает байт 00 или 2F, встроенный в него, fsck должен исправить это.)

Скорее, у вас есть имена файлов, которые прикладное программное обеспечение (Dolphin, ls) думаю, содержат символы, которые не в вашем «локали», поэтому заменяют их символами-заполнителями. Вы также не можете вводить эти символы, поэтому манипулирование файлами сложнее, но вы можете сделать это до тех пор, пока вы это сделаете, не набирая и не копируя и не вставляя имя. Например, если вы удаляете или переименовываете файлы проблем непосредственно из Dolphin, это должно просто работать (я бы зашел так далеко, чтобы сказать, что если это не сработает, это ошибка в Dolphin).

[d6 ] Если вам нужно что-то сделать с оболочкой (например, если они принадлежат root и поэтому не могут быть изменены программой GUI), вы можете косвенно назвать их с помощью шаблонов «glob», которые будут расширены на правильную последовательность (байты) байтов.

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

$ rename '$_ = unpack("H*", $_)' *

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

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

Внимание: существует две программы с именем rename, из разных источников; приведенные выше команды будут работать только с тем, что происходит с Perl. В Ubuntu, который вы хотите, это тот, который вы хотите получить от пакета «rename», а не из пакета «util-linux». rename -h будет различать: это то, что вы хотите ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... это не то, что вы хотите ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

Ключ к искать - «perlexpr». У вас может быть более старая версия переименования Perl, которая не понимает всех вышеперечисленных параметров, но команда, которую я показал, все равно должна работать.

Изменить: под 14.04 .5 скрипт perl, который включен для [ f13] не поддерживает переключатель -h. Вы можете подтвердить, что у вас есть правильный, проверив его man-страницу с man rename, в этом случае верхняя строка будет содержать:

RENAME (1) Справочник программистов Perl RENAME (1)
13
ответ дан 22 May 2018 в 15:50
  • 1
    rename --version Неизвестный вариант: версия – Elder Geek 10 January 2018 в 20:03
  • 2
    @ElderGeek Что делает file $(which rename) печать? (Прежде всего убедитесь, что у вас установлен пакет file.) – zwol 10 January 2018 в 20:36
  • 3
    /usr/bin/rename: symbolic link to /etc/alternatives/rename (file установлен по умолчанию) На самом деле вам нужно преследовать символические ссылки, чтобы получить /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable , но man rename - более быстрое указание ... – Elder Geek 11 January 2018 в 18:50
  • 4
    @ElderGeek Если это скрипт perl, то это, вероятно, более старая версия «одна из Perl», которая не поддерживает --version; команда, которую я предложил, должна по-прежнему работать. (/usr/share/doc/rename/changelog.gz на моем компьютере, который работает с нестабильной Debian, указывает, что --version был добавлен в версию 0.10 переименования Perl в 2013 году. Я удивлен, что Ubuntu все еще отправляет что-то более старое чем это, но эта программа на самом деле не изменила функциональность с 2007 года (!), так что это нормально.) – zwol 11 January 2018 в 18:57
  • 5
    Ах! Это объясняет путаницу. Несмотря на многочисленные утверждения об обратном, Debian не Ubuntu. Я не могу говорить для каждого выпуска, но некоторые поддерживаемые в настоящее время версии Ubuntu LTS (14.04) все еще не имеют этого. (Хотя 16.04 делает) – Elder Geek 11 January 2018 в 19:04

Важно понимать, что это не относится к «повреждению файловой системы», с которым поможет fsck. Что касается файловой системы, имена файлов могут быть любой последовательностью байтов, если ни один байт не имеет значения 0x00 (ASCII NUL, C концевой маркер) или 0x2F (/, разделитель каталога) , (Если имя файла каким-то образом получает байт 00 или 2F, встроенный в него, fsck должен исправить это.)

Скорее, у вас есть имена файлов, которые прикладное программное обеспечение (Dolphin, ls) думаю, содержат символы, которые не в вашем «локали», поэтому заменяют их символами-заполнителями. Вы также не можете вводить эти символы, поэтому манипулирование файлами сложнее, но вы можете сделать это до тех пор, пока вы это сделаете, не набирая и не копируя и не вставляя имя. Например, если вы удаляете или переименовываете файлы проблем непосредственно из Dolphin, это должно просто работать (я бы зашел так далеко, чтобы сказать, что если это не сработает, это ошибка в Dolphin).

Если вам нужно что-то сделать с оболочкой (например, если они принадлежат root и поэтому не могут быть изменены программой GUI), вы можете косвенно назвать их с помощью шаблонов «glob», которые будут расширены на правильную последовательность (байты) байтов.

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

$ rename '$_ = unpack("H*", $_)' *

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

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

Внимание: существует две программы с именем rename, из разных источников; приведенные выше команды будут работать только с тем, что происходит с Perl. В Ubuntu, который вы хотите, это тот, который вы хотите получить от пакета «rename», а не из пакета «util-linux». rename -h будет различать: это то, что вы хотите ...

$ rename -h Usage: rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr [ files ] # ...

... это не то, что вы хотите ...

$ rename -h Usage: rename [options] <expression> <replacement> <file>... # ...

Ключ к искать - «perlexpr». У вас может быть более старая версия переименования Perl, которая не понимает всех вышеперечисленных параметров, но команда, которую я показал, все равно должна работать.

Изменить: под 14.04 .5 скрипт perl, который включен для rename не поддерживает переключатель -h. Вы можете подтвердить, что у вас есть правильный, проверив его man-страницу с man rename, в этом случае верхняя строка будет содержать:

RENAME (1) Справочник программистов Perl RENAME (1)
13
ответ дан 18 July 2018 в 00:11

Важно понимать, что это не относится к «повреждению файловой системы», с которым поможет fsck. Что касается файловой системы, имена файлов могут быть любой последовательностью байтов, если ни один байт не имеет значения 0x00 (ASCII NUL, C концевой маркер) или 0x2F (/, разделитель каталога) , (Если имя файла каким-то образом получает байт 00 или 2F, встроенный в него, fsck должен исправить это.)

Скорее, у вас есть имена файлов, которые прикладное программное обеспечение (Dolphin, ls) думаю, содержат символы, которые не в вашем «локали», поэтому заменяют их символами-заполнителями. Вы также не можете вводить эти символы, поэтому манипулирование файлами сложнее, но вы можете сделать это до тех пор, пока вы это сделаете, не набирая и не копируя и не вставляя имя. Например, если вы удаляете или переименовываете файлы проблем непосредственно из Dolphin, это должно просто работать (я бы зашел так далеко, чтобы сказать, что если это не сработает, это ошибка в Dolphin).

Если вам нужно что-то сделать с оболочкой (например, если они принадлежат root и поэтому не могут быть изменены программой GUI), вы можете косвенно назвать их с помощью шаблонов «glob», которые будут расширены на правильную последовательность (байты) байтов.

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

$ rename '$_ = unpack("H*", $_)' *

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

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

Внимание: существует две программы с именем rename, из разных источников; приведенные выше команды будут работать только с тем, что происходит с Perl. В Ubuntu, который вы хотите, это тот, который вы хотите получить от пакета «rename», а не из пакета «util-linux». rename -h будет различать: это то, что вы хотите ...

$ rename -h Usage: rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr [ files ] # ...

... это не то, что вы хотите ...

$ rename -h Usage: rename [options] <expression> <replacement> <file>... # ...

Ключ к искать - «perlexpr». У вас может быть более старая версия переименования Perl, которая не понимает всех вышеперечисленных параметров, но команда, которую я показал, все равно должна работать.

Изменить: под 14.04 .5 скрипт perl, который включен для rename не поддерживает переключатель -h. Вы можете подтвердить, что у вас есть правильный, проверив его man-страницу с man rename, в этом случае верхняя строка будет содержать:

RENAME (1) Справочник программистов Perl RENAME (1)
13
ответ дан 24 July 2018 в 17:10
  • 1
    rename --version Неизвестный вариант: версия – Elder Geek 10 January 2018 в 20:03
  • 2
    @ElderGeek Что делает file $(which rename) печать? (Прежде всего убедитесь, что у вас установлен пакет file.) – zwol 10 January 2018 в 20:36
  • 3
    /usr/bin/rename: symbolic link to /etc/alternatives/rename (file установлен по умолчанию) На самом деле вам нужно преследовать символические ссылки, чтобы получить /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable , но man rename - более быстрое указание ... – Elder Geek 11 January 2018 в 18:50
  • 4
    @ElderGeek Если это скрипт perl, то это, вероятно, более старая версия «одна из Perl», которая не поддерживает --version; команда, которую я предложил, должна по-прежнему работать. (/usr/share/doc/rename/changelog.gz на моем компьютере, который работает с нестабильной Debian, указывает, что --version был добавлен в версию 0.10 переименования Perl в 2013 году. Я удивлен, что Ubuntu все еще отправляет что-то более старое чем это, но эта программа на самом деле не изменила функциональность с 2007 года (!), так что это нормально.) – zwol 11 January 2018 в 18:57
  • 5
    Ах! Это объясняет путаницу. Несмотря на многочисленные утверждения об обратном, Debian не Ubuntu. Я не могу говорить для каждого выпуска, но некоторые поддерживаемые в настоящее время версии Ubuntu LTS (14.04) все еще не имеют этого. (Хотя 16.04 делает) – Elder Geek 11 January 2018 в 19:04

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

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