Как удалить файл, в котором имя файла имеет проблемы с символами 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
~$
Имейте в виду, что жесткие ссылки используют один и тот же номер инода для нескольких имен, поэтому вы должны убедиться, что нигде не будет добавлено случайное дополнительное имя, которое также удаляется (если, конечно, вы этого не хотите).
Какие у вас "масштабные" цели?
Почему этого недостаточно?
$ rm Test_*
Один из способов погрузиться в дерево каталогов файлов:
$ find /your/base/dir -maxdepth 3 -type f -name 'Test_*' -exec rm {} \;
Вы можете настроить команду find для обнуления ваших файлов.
Мы также можем использовать эту команду rm ./"Test_ Mürz.jgp"
удалить такие файлы
Есть три метода:
- использовать inode против имени файла. сначала выполните команду ls и проверьте файл inode, описанный выше
- для чайников используйте Midnight Commander:)
- Вы должны избегать специальных символов. пробел (_ для визуальности) _ вы заменяете как _, так и другие символы.
- Вы можете использовать расширение bash. В начале записи напишите: rm Test_ и нажмите клавишу TAB. Они расширяют экранированные символы сразу для уникальных имен или отображают возможности для вас не уникальных. Тогда вы увидите, как хорошо вы пишете специальные символы в командной строке.
- вы можете избежать Unicode, экранируя: somename\263\261rest_of_name . Вы можете использовать десятичные коды символов для экранирования.