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

Невозможно удалить файл с помощью rm

На одном из наших серверов (IBM AIX) у нас есть файл по пути / data / 1002 /, который мы не смогли удалить или удалить с помощью команды rm. Мы получили сообщение об ошибке: «rm: S1208001.002: файл или каталог в указанном пути не существует».

С параметром «-f» сообщение об ошибке не выводилось, но файл все еще существует.

Этот файл имеет размер байта «0», и когда я использую команду «touch S120801.002», я вижу два файла с одинаковым именем в этом каталоге.

Список каталогов выглядит следующим образом:

$ ls -l total 56
-rwxrwxrwx    1 oracle   dba               0 Feb 09 11:57 S1208001.002 
drwxrwxrwx    4 nobody   dba           24576 Feb 09 13:36 backup

Как мне удалить эту фальшивку?

Спасибо.

ОБНОВЛЕНИЕ 1

после использования сенсорной команды список каталогов выглядит следующим образом:

$ ls -l total 56
-rwxrwxrwx    1 oracle   dba               0 Feb 09 11:57 S1208001.002 
-rwxrwxrwx    1 oracle   dba           77790 Feb 09 14:30 S1208001.002
drwxrwxrwx    4 nobody   dba           24576 Feb 09 13:36 backup

Похоже, это имя файла может содержать непечатаемый символ. Это объяснило бы "прикосновение" к созданию другого файла.

Попробуйте что-нибудь вроде

       ls -b

в каталоге, чтобы узнать, так ли это?

Тогда вы сможете сделать что-то вроде:

       rm -i S*2 

и он должен предложить вам файл даже со скрытым символом.

В качестве альтернативы вы можете использовать find для этого ...

       find . -name S\*2 -exec /bin/rm -i {} \;

должен запросить у вас файлы ... Я не знаю, необычен ли синтаксис AIX 'find', поэтому это может не сработать, но часть 'rm -i' должна позволить вам прервать команду, если она неверна.

Вы можете попробовать inode. Я не уверен, что у вас там происходит, но, возможно, стоит попробовать:

$ touch badfile^M
$ ls -il bad*
   99 -rw-r--r--    1 username  group               0 Feb 09 04:39 badfile
$ find . -inum 99 -exec /bin/rm {} \;
$ ls -li bad*
ls: 0653-341 The file bad* does not exist.

В конце файла есть пробел (или другой непечатаемый символ). Попробуйте выбрать обе строки в своем $ ls -l вывод, чтобы увидеть это. Чтобы удалить его, вы можете попробовать полностью безопасная находка метод:

dir=/path/to/your/directory

absolute_dir_path_x="$(readlink -fn -- "$dir"; echo x)"
absolute_dir_path="${absolute_dir_path_x%x}"

while IFS= read -rd $'\0' path
do
    file_path="$(readlink -fn -- "$path"; echo x)"
    file_path="${file_path%x}"
    echo "START${file_path}END"
done < <( find "$absolute_dir_path" -type f -name '*S1208001*' -print0 )

Тогда вы, вероятно, можете просто добавить rm -- "${file_path}" в конце цикла while.

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

Я видел нечто подобное на NetApp-Shares, смонтированных по NFS. Просто подождите немного, и файл исчезнет.

У меня возникла аналогичная проблема, и простой fsck (а затем снова rm) решил мою проблему