удалить файл со специальными символами - PullRequest
0 голосов
/ 21 сентября 2018

У меня странный файл в файловой системе Unix.Кажется, в имени файла есть некоторые специальные символы, но я не смог его удалить.Даже если я не пишу имя непосредственно в команде rm (а вместо этого пишу ls | rm), я получаю сообщение об ошибке, что файл не существует.Ниже приведены некоторые команды, которые я пробовал после нескольких поисков в Интернете, чтобы устранить проблему.

Есть ли у вас какие-либо предложения по его удалению?Система AIX 7.1.Я тоже пробовал с rm и perl скриптом (просто перечислял все файлы и удалял все из папки), но ни один не работал.Я также не могу переместить папку в /tmp, я получаю ту же ошибку.

Спасибо!

[root@server] ls -1b | od -bc
0000000  342 134 062 060 060 134 062 062 063 012
           ▒   \   2   0   0   \   2   2   3  \n
0000012
[root@server]$ ls -li
ls: 0653-341 The file ./– does not exist.
total 0
[root@server]$ ls
–
[root@server]$ ls | od -bc
0000000  342 200 223 012
           ▒ 200 223  \n
0000004
[root@server]$ rm *
rm: –: A file or directory in the path name does not exist.

Снимок экрана ниже:

сбой rm

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Относительно безопасным способом было бы перечислить файлы inode с помощью ls -i, а затем удалить тот, который вам нужен, с помощью find . -maxdepth 1 -type f -inum $inum -delete ($inum - это индекс для удаления).

И будьте благодарны, что вы на Unix!❤

0 голосов
/ 21 сентября 2018

Ваше имя файла содержит тире ;это не знак дефиса-минуса - (юникод U + 002D HYPHEN MINUS , также в ASCII ), но U + 2013 EN DASH в Unicode .Возможно, имя вашего файла содержит другие странные символы (тогда вам нужно найти, какие из них).

Попробуйте сначала перечислить этот файл, без globbing , используя ls (1) команда (читайте о path_resolution (7) ...).Также рассмотрите возможность использования strace (1) в этой команде ls.Попробуйте также echo * | od -cxi, чтобы понять, что происходит.Это означает, что некоторые ls ./– (или что-то подобное).Я полагаю, что это работает (возможно, требуется цитирование ).Найдите точно, как заставить ls ./– | od -cxi работать правильно.Затем используйте ls -l вместо просто ls, чтобы быть уверенным (иногда ls может быть с псевдонимом , поэтому вам нужно отключить это, возможно, набрав /bin/ls вместо ls)

Вы можете удалить его, скопировав / вставив это странное имя, или, после соответствующего изменения вашего рабочего каталога с cd, возможно с

rm ./–

последний символ этой команды ( copy / paste d) - Unicode U + 2013 EN DASH;Как точно ввести этот юникодный символ en-dash - это отдельная история (это может зависеть от среды вашего рабочего стола, вашего эмулятора терминала, вашего оконного менеджера, вашей раскладки клавиатуры, вашей локализации).На десктопах Linux может помочь утилита charmap GUI (из пакета Debian или Ubuntu gucharmap).Вы можете выбрать этот символ с помощью мыши (среди тысяч других символов Юникода) и скопировать / вставить его в UTF-8.

Если в вашем каталоге есть несколько записей, вы можете попробовать

  rm -rif .

и команда /bin/rm будет запрашивать у вас каждую запись (или попробуйте просто rm -if *, если вы не хотите заходить в подкаталоги).

Если непослушный файл является единственным в своем каталоге (исключая, конечно, записи . и ..; проверьте с помощью ls -al), вы можете rm -rf этот каталог и воссоздать этот каталог с помощьюmkdir

Если ваша оболочка настроена на glob для символов Юникода (не только для байтов или ASCII), вы можете попробовать rm -i ./?

Если ничего не работаетВы даже можете написать небольшую C-программу, вызывающую remove (3) или rename (2) (и проверяющую, что это удалось) на "\342\200\223" ( UTF-8 кодировка en-dash).Если вам нужно программно сканировать ваш странный каталог (чтобы найти точное странное имя), рассмотрите nftw (3) или opendir (3) , цикл включен readdir (3) с stat (2) и т. Д. ... Или код, написанный на языке сценариев, таком как Python.И вы можете использовать некоторый файловый менеджер с графическим интерфейсом, делающий то же самое.

В 2018 году у нас везде есть UTF-8 .Если по ошибке ваш рабочий стол и локализация не используют UTF-8, вам необходимо это исправить.См. locale (7) .

Вы также можете использовать команду printf (1) , чтобы получить этот странный символ (эта printf команда есть в POSIX).Поэтому команда rm -v $(printf "\342\200\223") должна работать (в AIX rm может не соответствовать GNU, поэтому вы не можете использовать rm -v только rm)

...