Назад | Перейти на главную страницу

Как удалить файл, в имени которого есть проблемы с символом utf-8

Я хочу удалить файл с сервера через bash rm команда.

Это образец файла Test_ Mürz.jgp.

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

Для отдельных файлов или небольших наборов файлов, если подстановка подстановочных знаков не позволяет добиться необходимой точности, вы можете комбинировать ls -i (или stat, если есть) и find -inum.

В целях безопасности при использовании find's -inum, всегда обязательно используйте -xdev чтобы ограничить поиск одной файловой системой. Невыполнение этого может привести к неожиданным результатам.

Например:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -exec rm -i '{}' ';'
rm: remove regular file `./myweirdfile'? y
~$

В качестве альтернативы, при одном вызове (это может зависеть от GNU coreutils stat, что должно быть довольно безопасным предположением в Linux и использует замену процесса в стиле sh):

~$ find . -xdev -inum $(stat -c '%i' 'myweirdfile') -exec rm -i '{}' ';'
rm: remove regular file `./myweirdfile'? y
~$

Вы также можете использовать find -delete действие, а не -exec'ing rm. Для действительно странных имен файлов это может быть безопаснее. Использовать -print или -ls сначала, чтобы проверить, какой файл будет удален. Примерно так:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -print
./myweirdfile
~$ find . -xdev -inum 183435818 -delete
~$ find . -xdev -inum 183435818 -print
~$

Имейте в виду, что жесткие ссылки используют один и тот же номер inode для нескольких имен, поэтому вы хотите убедиться, что нигде нет случайного дополнительного имени, которое также удаляется (если вы хотеть для этого, очевидно).

Простой способ:

ls -i Test_*

rm -i [inode number]

Какие «масштабные» цели у вас есть?

Почему этого недостаточно?

$ rm Test_*

Один из способов погрузиться в дерево каталогов файлов:

$ find /your/base/dir -maxdepth 3 -type f -name 'Test_*' -exec rm {} \;

Вы можете настроить команду find для обнуления ваших файлов.

мы также можем использовать эту команду rm ./"Test_ Mürz.jgp"удалить такие файлы

есть три метода:

  1. использовать индексный дескриптор против имени файла. сначала выполните команду ls и проверьте файл inode, как описано выше
  2. для чайников используйте Midnight Commander :)
  3. вы должны экранировать специальные символы. пробел (_ для наглядности) _ вы заменяете как _ и другие символы.
  4. вы можете использовать расширение bash. При запуске напишите начало: rm Test_ и нажмите клавишу TAB. Они немедленно расширяют экранированные символы для получения уникальных имен или отображают возможности для неуникальных имен. Затем вы увидите, как нужно писать специальные символы в командной строке.
  5. вы можете избежать Unicode, выполнив экранирование: somename \ 263 \ 261rest_of_name. для экранирования можно использовать десятичные коды символов.