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

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

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

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

5 ответов

Решение

Для отдельных файлов или небольших наборов файлов, если использование подстановочных знаков не дает вам необходимой точности, вы можете комбинировать 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, которая должна быть довольно безопасным допущением в Linux и использует подстановку процессов в стиле sh):

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

Вы также можете использовать поиск -delete действие, а не -execИнг. Для действительно странных имен файлов это может быть безопаснее. использование -print или же -ls Сначала проверьте, какой файл будет удален. Что-то вроде следующего:

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

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

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

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. использовать inode против имени файла. сначала выполните команду ls и проверьте файл inode, описанный выше
  2. для чайников используйте Midnight Commander:)
  3. Вы должны избегать специальных символов. пробел (_ для визуальности) _ вы заменяете как _, так и другие символы.
  4. Вы можете использовать расширение bash. В начале записи напишите: rm Test_ и нажмите клавишу TAB. Они расширяют экранированные символы сразу для уникальных имен или отображают возможности для вас не уникальных. Тогда вы увидите, как хорошо вы пишете специальные символы в командной строке.
  5. вы можете избежать Unicode, экранируя: somename\263\261rest_of_name . Вы можете использовать десятичные коды символов для экранирования.
Другие вопросы по тегам