На одном из наших серверов (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) решил мою проблему