Không có tập tin hoặc thư mục nào như vậy khi cố gắng xóa một tập tin, nhưng tập tin tồn tại?


21

Tôi đang cố gắng xóa hình ảnh png đã được tải lên máy chủ của mình thông qua tập lệnh PHP. Bất cứ khi nào tôi cố gắng xóa cả thông qua ftp và terminal, tôi đều gặp lỗi

No such file or directory

Tuy nhiên, khi tôi lstrong thư mục, tệp được liệt kê và nó cũng được liệt kê trong ứng dụng khách FTP của tôi. Tôi đã thử tạo một tệp có cùng tên và cuối cùng tôi nhận được hai tệp có cùng tên.

Tôi có thể mở tệp được cho là không tồn tại, nhưng tôi vẫn không thể xóa tệp. Tôi cũng đã thử khởi động lại máy chủ của mình. Bất kỳ ý tưởng những gì có thể là vấn đề? Tôi đang chạy phiên bản 64 bit của Ubuntu, nhưng tôi không nghĩ đó là vấn đề 32/64 bit. Tôi cũng cần lưu ý rằng tôi đã xóa nhiều tệp png khác được tải lên bởi cùng một tập lệnh PHP.

Đầu ra cho ls -l

total 224 
-rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png 
-rw-r--r-- 1 root root 272 May 14 06:54 upload.php

Đầu ra khi cố gắng rm

rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory

tải lên.php: http://pastebin.com/z87eypTY


Sao chép dán đầu ra của ls -lthư mục, cũng là rmlệnh đầy đủ và đầu ra của nó ..
heemayl

@heemayl tổng cộng 224 -rw-r - r-- 1 www-data www-data 222838 Ngày 13 tháng 5 04:14 qyxdshyikfr_fishing_timeout.png -rw-r - r-- 1 root root 272 May 14 06:54 upload.php rm: không thể xóa 'qyxdshyikfr_fishing_timeout.png': Không có tệp hoặc thư mục như vậy
DevinFbler

1
@DevinFbler vui lòng chỉnh sửa câu hỏi của bạn để thêm thông tin.
muru

Từ thư mục nào bạn đang chạy rmlệnh?
heemayl

1
@Samuel Tại sao điều này sẽ đề xuất một vấn đề hệ thống tập tin? Cuộc unlinkgọi sẽ luôn không tìm thấy tệp không tồn tại. Khi tôi chạy stracelệnh đó trên hệ thống của mình , nơi tôi biết tôi không có tệp đó, nó tạo ra đầu ra tương tự; Tôi không nghĩ rằng điều đó cho thấy tôi có vấn đề về hệ thống tập tin! Có vẻ như nhiều khả năng là tên của tệp hơi khác so với qyxdshyikfr_fishing_timeout.pngvà chỉ xuất hiện giống nhau do những hạn chế trong cách lshiển thị tên tệp, như được đề xuất trong các câu trả lời khác.
Eliah Kagan

Câu trả lời:


21

Tôi đã thử tạo một tệp có cùng tên và cuối cùng tôi nhận được hai tệp có cùng tên.

Mà nói, vắng mặt hệ thống tập tin tham nhũng, rằng bạn có hai tập tin với hai tên khác nhauxuất hiện cùng vì các ký tự không in hoặc ký tự giống nhau trong bộ ký tự của bạn / font. Các --escapetùy chọn để lslà bạn của bạn trong trường hợp như vậy, cũng như các công cụ như cat -v.

Cũng vậy, là rm -i -- *

đọc thêm


Tôi là người tạo ra tệp và tên tệp đã được tải lên. Không ai cố gắng phá hoại máy chủ của tôi vì tôi là người duy nhất biết đường dẫn hoàn chỉnh để tải lên.php Tuy nhiên, rm -i -- *đã thực hiện thủ thuật này.
DevinFbler 14/05/2015

3
@DevinFbler Nếu câu trả lời này giải quyết được vấn đề của bạn, vui lòng đánh dấu nó là câu trả lời được chấp nhận bằng cách nhấp vào dấu dưới số lượng upvote, để người dùng trong tương lai có thể nhận ra thực tế rằng giải pháp này hiệu quả với bạn.
kos

1
Ai đó có thể giải thích rm -i -- *lệnh?
dùng3731622

Từ những gì tôi hiểu: Passing -i sẽ nhắc bạn trước khi xóa từng tệp. --trước khi *chọn tất cả các tệp bất kể tên của chúng có bao gồm các ký tự đặc biệt hay không. Tham khảo: https://explainshell.com/explain?cmd=rm+-i+--+*
MoltenMuffins

16

TL; DR: Chạy ls -1b, tìm tên tệp, sao chép dòng mà nó xuất hiện và đưa nó vào rm.

Như những người khác đã đề xuất, rất có thể điều này là do những hạn chế trong cách thức ls- và một số chương trình khác, bao gồm phần mềm máy khách và máy chủ - xử lý các tên tệp lạ, chẳng hạn như các tệp chứa ký tự điều khiển, theo mặc định. Thành công của bạn với câu trả lời của JdeBP cho thấy mạnh mẽ đây là trường hợp, mặc dù nó đã được đặt cược tốt ngay cả trước đó.

  • Đối với ls, khi đầu ra tiêu chuẩn là một thiết bị đầu cuối, các ?ký tự được in ở vị trí của chúng. Vì vậy, nếu bạn không đưa lsđầu ra của bất kỳ lệnh nào khác (hoặc chuyển hướng nó sang nhật ký để xem), có lẽ tên tệp của bạn không chứa các ký tự điều khiển. Nhưng có những ký tự có vấn đề khác - có lẽ tên tệp chứa khoảng trắng ở cuối.

    Hành vi này lscó thể gây nhầm lẫn nhưng không phải là một lỗi, có thể được ghi đè rõ ràng bởi người dùng (xem bên dưới).

  • Khi cố gắng truy cập hoặc xóa tệp từ xa, lỗi trong phần mềm máy khách hoặc máy chủ có thể gây ra sự cố như vậy.

    Tôi đã trải nghiệm loại điều này qua ftpbản thân mình nhiều lần , bao gồm cả các tệp có tên chứa dấu cách. . có thể trông giống như không gian mặc dù nó không phải là.

Đây là một tình huống trong đó ls -1b(hoặc dir -1) có ích:

  • -1nói lsđể hiển thị một mục nhập trên mỗi dòng. Bằng cách đó, không có sự nhầm lẫn về nơi một tên tệp kết thúc và một tên tệp khác bắt đầu. Điều này rất hữu ích cho các tập tin có tên kỳ lạ.
  • -bnói lsđể in các chuỗi thoát cho bất kỳ ký tự đặc biệt. Đầu ra của ls -bcó thể được sao chép và dán theo nghĩa đen vào một lệnh, không có trích dẫn bổ sung : tất cả các ký tự có vấn đề đã được trích dẫn theo cách khiến shell nhận ra chúng là những gì chúng là.

Chỉ có một cảnh báo: nếu ký tự cuối cùng trên một dòng xuất hiện \, sao chép một ký tự sau đó, vì điều này có nghĩa \là trích dẫn một khoảng trắng.

Bạn có thể chạy ls -1bnhư vậy hoặc bạn có thể truyền mô hình toàn cầu shell cho nó (ví dụ ls -1b qyx*:). Globbing có thể hoặc không thể tìm thấy tệp, tùy thuộc vào việc các ký tự điều khiển (hoặc các ký tự lạ khác) có trong phần tên xuất hiện trong mẫu hình cầu hay không.

Sau khi sao chép \phiên bản được trích dẫn của tên tệp được cung cấp cho bạn ls, bạn có thể dán mã này vào lệnh. Bạn không phải sửa đổi nó bằng tay theo bất kỳ cách nào. Trong trường hợp của bạn, như bạn muốn xóa tệp, nhập rm, nhập khoảng trắng, dán dòng và nhấn Enter.

Đọc thêm:


1
Rất tuyệt vời -bthx =) và +1
AB

Một cái gì đó tôi rời khỏi OP là khi tôi tạo một tệp có cùng tên, trong ứng dụng khách ftp của tôi khi tôi cố xóa tệp đầu tiên mà tôi gặp sự cố, thay vào đó nó sẽ xóa tệp mới mà tôi đã tạo. Đó là lý do tại sao tôi không nghĩ có bất kỳ nhân vật đặc biệt nào có liên quan và tôi vẫn không biết nhân vật đặc biệt đó là gì kể từ khi tôi sử dụng rm -i -- *.
DevinFbler 14/05/2015

@DevinFbler Ký tự phụ là khoảng trắng ở cuối tên tệp. Nó vẫn ở lsđầu ra trong câu hỏi, nhưng chỉ có thể được nhìn thấy trong chế độ văn bản khi bạn nhấp vào "chỉnh sửa".
Izkata

@Izkata Gọi tốt! Tôi nên nghĩ rằng để kiểm tra điều đó. Nó cũng xuất hiện khi tôi mở rộng phiên bản 3 trong lịch sử chỉnh sửa (tên tệp đầy đủ, bao gồm cả dấu cách, được tô sáng màu xanh lá cây và do đó có thể thấy rõ). Những gì bạn đã nói là lời giải thích chính xác và cụ thể nhất cho đến nay - nếu bạn đăng một câu trả lời giải thích rằng đó là từ một khoảng trống, và làm thế nào bạn biết, và lệnh nào sẽ xóa tệp (nếu OP vẫn có nó) , Tôi biết tôi sẽ nâng cấp nó.
Eliah Kagan

@EliahKagan Xong, có hình ảnh
Izkata

3
  1. Sử dụng findvà kiểm tra đầu ra:

    Nếu không tìm thấy tệp, thì hãy rút ngắn cụm từ tìm kiếm *qyxdshyikfr*một chút, ví dụ: *qyxds*hoặc *fishing*.

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. Nếu ok, hơn sử dụng findvới thuật ngữ tìm kiếm trong bước 1 vàrm

    find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm
    

1
Thay vì gọi rmtheo tên thông qua một đường ống từ findđến xargs, tôi khuyên bạn nên sử dụng đơn giản findcủa -deletehành động. Cũng sudokhông cần thiết. Ít quan trọng hơn, tôi đề nghị bỏ qua -type ftrừ khi nó rõ ràng hữu ích. Có lẽ nếu mục nhập mà OP muốn xóa hóa ra là một liên kết tượng trưng, ​​chẳng hạn, họ vẫn muốn tìm nó và vẫn muốn xóa nó. Các -deletehành động sẽ không đệ quy clobber một thư mục; rmlệnh của bạn cũng không vì bạn không có -r. Vì vậy, bạn sẽ không vô tình đánh cắp toàn bộ thư mục (không trống) ở đây bằng cách không sử dụng -type.
Eliah Kagan

OK, cho tôi một giây.
AB

Trong trường hợp của tôi, thậm chí còn find ... -deletenói "không thể xóa ... Không có tệp hoặc thư mục như vậy"
Ngừng làm hại Monica

1

Đăng lại chi tiết, mở rộng từ nhận xét của tôi về câu trả lời của Eliah

Vấn đề là vô hình, nhưng có thể được nhìn thấy nếu bạn biết phải tìm gì: Tên tệp bao gồm một khoảng trắng ở cuối. Vì bạn sao chép / dán toàn bộ lsđầu ra, nên có thể thấy trong câu hỏi nếu bạn làm nổi bật đầu ra, hoặc chỉnh sửa bài đăng và di chuyển con trỏ đến cuối hoặc (như Eliah đã chỉ ra) nhìn vào khác biệt trong lịch sử chỉnh sửa. Tôi nhấn mạnh lsđầu ra trong bài viết trong ảnh chụp màn hình này:

Không gian thêm

Một phiên thiết bị đầu cuối nhỏ nhanh chóng để nhân đôi vấn đề, với ý kiến:

$ touch 'foo '        # Create file with a space at the end
$ ls -l               # Space is not visible in ls output
total 0
-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo 

$ rm foo              # Cannot remove it when not specifying the space
rm: cannot remove ‘foo’: No such file or directory

$ rm 'foo '           # Can remove it if we quote the file name and include the space
$ rm foo\             # Or can escape the space to tell bash to include it as part of the filename

Sử dụng hoàn thành tab cũng sẽ khắc phục hoàn toàn vấn đề ở đây, vì bash đủ thông minh để thoát không gian chính xác (Nói chung, đó cũng là một thói quen tốt, tăng tốc độ gõ đường dẫn rất nhiều) .

Ví dụ, nếu tôi đã gõ rm f<tab>, nó sẽ tự động hoàn thành rm foo\<space><space>, như trong ví dụ cuối cùng trong khối mã ở trên.


Tôi đặc biệt đề cập đến việc sao chép / dán lsđầu ra bởi vì điều gì đó tương tự đã xảy ra trên StackOverflow một lần (và đó là toàn bộ lý do tôi nghĩ để tìm kiếm điều này): ai đó có một ký tự không in được trong mã của họ và lý do duy nhất bất cứ ai phát hiện ra là bởi vì người dùng đó cũng sao chép / dán thay vì nhập lại mã của họ khi đăng câu hỏi
Izkata

0

một lần, tôi đã tạo một tệp để mở Nautilus với quyền root, nhưng tên tệp khi nhìn thấy từ nautilus là "Trình duyệt tệp (root)", sau đó khi tôi cố xóa

$ rm "File Browser (Root)"
$ sudo rm "File Browser (Root)"
$ sudo rm "File Browser (Root).desktop"

anwser duy nhất tôi nhận được là: "rm: không thể xóa 'Trình duyệt tệp (Root) .desktop': Không có tệp hoặc thư mục như vậy"

sau đó khi tôi chạy:

$ ls -l

Tôi đã thấy / nhớ rằng tên tập tin, trên thực tế, là "Nautilus-root.desktop"

vì vậy tôi chạy:

$ sudo rm "Nautilus-root.desktop"

làm việc cho tôi, hy vọng nó sẽ giúp!


0

Vì vậy, tôi đã có vấn đề này và không ai trong số những điều này làm việc cho tôi. Những gì đã làm việc là tạo ra một tập tin với cùng tên chính xác. Đó là một thư mục có tên là Ví dụ.1.2.3 vì vậy tôi đã tạo một thư mục mới và đặt tên chính xác giống như thư mục sẽ không xóa. Thư mục cũ biến mất và tôi xóa cái mới.


0

Tôi đã gặp một tình huống tương tự, sau khi sử dụng rsyncđể sao lưu thư mục Ảnh của mình trên máy Mac và đọc nó trên Ubuntu. Có hai tệp (thực sự là thư mục) với các tên khác nhau, nhưng có cùng nội dung. Tôi đã xóa một cái vào Thùng rác (sử dụng Nautilus), nhưng không thể xóa cái kia, ngay cả từ dòng lệnh. Nó sẽ nói:

$ rmdir Pictures
rmdir: failed to remove 'Pictures': No such file or directory
$ rm Pictures
rm: cannot remove 'Pictures': Is a directory

Sau khi kiểm tra các số inode bằng ls -i -l, hóa ra cả hai thư mục có cùng số inode. Trông giống như một liên kết cứng ...

Giải pháp đơn giản đến mức đáng ngạc nhiên - làm trống Thùng rác bằng cách nhấp chuột phải vào biểu tượng. Sau đó cả hai thư mục đã biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.