サーバーの1つ(IBM AIX)で、パス/ data/1002 /にファイルがあり、「rm」コマンドを使用して削除または削除できませんでした。表示されたエラーメッセージは「rm:S1208001.002:パス名のファイルまたはディレクトリが存在しません」です。
「-f」オプションを使用すると、エラーメッセージは表示されませんでしたが、ファイルはまだそこにあります。
このファイルのバイトサイズは「0」で、「touch S120801.002」コマンドを使用すると、そのディレクトリに同じファイル名の2つのファイルが表示されます。
ディレクトリリストは次のとおりです。
$ 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
touchコマンドを使用した後、ディレクトリリストは次のようになります。
$ 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」の部分では、コマンドが間違っている場合は中止できます。
Iノードで試すことができます。あなたがそこでどんな特別な文字を使っているのかわかりませんが、これは試してみる価値があるかもしれません:
$ 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 )
次に、whileループの最後にrm -- "${file_path}"
を追加するだけです。
ファイルシステムは、最後のプロセスがファイルの使用を停止するまで、またはfsがクリーンアップするまでファイルを保持する可能性があります。
NFSマウントされたNetApp-Sharesで同様の何かを見てきました。少し待つと、ファイルが消えます。
私は同様の問題を経験し、単純なfsck(そして再びrm)が私の問題を解決しました