Chuyển đến thư mục không rõ tên


8

Trong khi giải nén tarball, tôi gặp một thư mục lsbáo cáo là "???????????????????" Có lẽ, tên không có trong unicode? Dù sao, tôi không thể tìm cách truy cập thư mục. Tôi đã thử cd $(find -inum inode_number), nhưng nó mang lại cho tôi

"bash: cd: ./??????????: No such file or directory".

Có cách nào khác để truy cập một thư mục trực tiếp bằng số inode của nó không?


Có lẽ nó là từ vựng đầu tiên trong danh sách thư mục? Sau đó cd */có thể làm việc. *nên mở rộng một mô tả dễ hiểu của thư mục và cdbỏ qua các đối số bổ sung. Một cách khác có thể là sử dụng trình quản lý tệp đồ họa (bao gồm MC dựa trên thiết bị đầu cuối) hoặc bộ điều hướng cây tập tin tích hợp trong ví dụ Vim. Bạn cũng có thể thử nghiệm trực tiếp với -execchuyển đổi sang find, not with cd` (là một vỏ được tích hợp sẵn) nhưng với ví dụ lsvà các công cụ khác.
Daniel Andersson

@Daniel: Trong một số shell, cdvới nhiều đối số không thành công.
Scott

@ Hủy: Đúng. POSIX không chỉ định hành vi của nhiều đối số. Bash và Dash bỏ qua các đối số bổ sung, csh thoát với " too many arguments".
Daniel Andersson

Câu trả lời:


3

Một cách tiếp cận chung để có thể hoạt động trên bất kỳ thư mục (hoặc tệp) nào là sử dụng số inode của nó.

Đầu tiên, sử dụng ls để lấy inode của thư mục được đề cập:

ls -lia
  • -l cho danh sách dài (tùy chọn)
  • -i để có được giá trị inode
  • -a để xem tất cả các tệp, thậm chí các tệp bị ẩn (tùy chọn)

Trong danh sách, bạn sẽ thấy một số dài trong cột đầu tiên, đại loại như thế này:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

Bây giờ bạn có thể thay đổi thư mục đó bằng cách sử dụng:

cd "$(find -inum ######)"

... nhưng thay thế ###### bằng số dài mà bạn có trong danh sách thư mục.

Tất nhiên lệnh không cần phải có cd. Nó có thể là rm, cp, mv, vv ...


2

Vì các ký tự có khả năng là ký tự quốc tế, nên chúng có thể xuất hiện dưới dạng mã kiểm soát trong bộ ký tự en_US của bạn, đó là lý do tại sao ls hiển thị chúng dưới dạng dấu hỏi.

Điều này có thể là do sự lựa chọn bí danh của phân phối của bạn theo mặc định trong hồ sơ toàn cầu. Ví dụ:

alias ls='ls -q'

Bạn có thể xem bản phân phối của mình đã thực hiện chưa bằng cách nhập vào trình bao của bạn:

alias ls

Mà sẽ in ra một cái gì đó như sau:

$ alias ls
alias ls='ls --color=auto'

Trang được liên kết bên dưới gợi ý rằng nếu bạn thực hiện "ls -b", bạn sẽ thấy các mã điều khiển bát phân để bạn biết ít nhất những ký tự nào đang được sử dụng.

http://www.arsc.edu/arsc/support/howtos/nonprintingchars/

Giả sử rằng không hoạt động, bạn có một tùy chọn khác cũng được đề cập ở gần phía dưới:

Một công cụ mà tôi không biết đến bây giờ được gọi là OctalDump (trên Debian - / usr / bin / od)

$ ls | od -b

Sẽ cho bạn thấy dạng bát phân của mã kiểm soát.

$ ls | od -c

Sẽ hiển thị cho bạn các ký tự bao gồm bất kỳ khoảng trắng bổ sung ẩn nào có thể ở cuối (lưu ý các khoảng trắng thừa ở cuối trong ví dụ của chúng)

Khi bạn biết nhân vật điều khiển nào đang chơi và liệu có thêm khoảng trắng ẩn nào không, bạn có thể hoàn thiện một cách để cd vào thư mục bằng cách thoát khỏi các ký tự điều khiển. Không, bạn có một vài lựa chọn để đổi tên thư mục.

Trang bên trên cũng thuận tiện, có một phương pháp nhanh và bẩn để loại bỏ các ký tự điều khiển thông qua lệnh mv, mà tôi nghĩ sẽ hoạt động, miễn là bạn KHÔNG thoát khỏi không gian, nhưng KHÔNG thoát khỏi các dấu hỏi (do đó biến chúng thành ký tự đơn ký tự đại diện), và miễn là không có gì khác tồn tại trong thư mục chứa thư mục giả mạo này. Lý do cho những yêu cầu rõ ràng này là do bạn chỉ sử dụng các ký tự đại diện và không gian duy nhất và do đó bạn không muốn ký tự đại diện vô tình khớp với bất kỳ tệp hoặc thư mục nào khác.

Nếu phương pháp trên không hoạt động, bạn gần như có thể chắc chắn sử dụng phương pháp tìm được đề cập bởi các phản hồi khác, theo một cách khác. Thay vì cố gắng cd vào thư mục bằng số inode, đó là những gì bạn nói bạn đã thử, bạn có thể đổi tên nó bằng số inode. Chỉ cần đảm bảo sao chép toàn bộ 3 dòng cho một lệnh đó từ trang bên trên (thay thế phần "tên mong muốn" bằng tên thực tế mà bạn muốn đổi tên thành tuy nhiên).

Khi thư mục được đổi tên, bạn sẽ có thể truy cập nó. Tôi chỉ có thể hy vọng rằng nó cũng không chứa các tệp có mã điều khiển trong tên hoặc bạn sẽ phải rửa và lặp lại cho mọi tệp (và / hoặc thư mục con) trong thư mục bạn vừa đổi tên, tại đó một vòng lặp for sẽ có lẽ nên khôn ngoan khi chỉ đặt tên cho mỗi tệp là một số, bằng cách tăng từ 1 .:-)


0

"?" có một ý nghĩa đặc biệt trong vỏ, nó có nghĩa là "bất kỳ nhân vật, bao gồm cả không". Vì vậy, nếu tập tin của bạn thực sự được đặt tên là "??????????????????" bạn có thể phải thoát khỏi "?" (và dấu cách không gian) để bạn có thể thử một cái gì đó như cd \? \? \? \? \? \? \ \? \? \? \? (nếu bạn chưa thử)

Đó là giả sử ai đó cố tình đặt cho tập tin cái tên khó hiểu đó, thay vào đó là mã hóa bị cắt xén / bị hỏng / bất hợp pháp.


1
Nhưng hãy nhớ rằng lsthích hiển thị các ký tự không phải ASCII (0x7F) dưới dạng Mạnh ?, vì vậy tên thư mục có thể không chỉ là một chuỗi các dấu hỏi.
Scott

0

Làm một ls. Có bất cứ điều gì trong thư mục (tập tin hoặc thư mục con) với một cái tên dài hơn thư mục con bí ẩn của bạn (đó là 21, nếu tên của bạn ???????????????????? chính xác)? Sau đó đổi tên chúng thành tên ngắn hơn hoặc chuyển chúng vào các thư mục khác. Sau đó gõ

cd ????????????????????*

Ký tự đại diện này (20 dấu hỏi theo dấu hoa thị) phải khớp với bất kỳ tên nào dài 20 ký tự hoặc dài hơn và hướng dẫn đầu tiên tôi đưa ra phải đảm bảo rằng thư mục con bí ẩn của bạn là thứ duy nhất khớp với mẫu đó. Nhưng nó có thể hữu ích hơn để làm

mv ????????????????????* tên mới


3
Có thể hữu ích khi chạy lsvới một trong hai --quoting-style=shellhoặc --quoting-style=escapetùy chọn để buộc nó tạo ra một phiên bản thoát đúng của tên tệp đó.
Dan D.

1
@DanD. +1 cho tùy chọn thú vị mà tôi không biết. Tôi thường chỉ sử dụng trình quản lý tệp gui khi phải xử lý vấn đề như thế này, nhưng nó có thể có ích nếu tôi phải làm việc từ bảng điều khiển hoặc trong tập lệnh.
Joe

0

Một cách dễ dàng để xem những gì có trong FTP với máy với FileZilla. Sau đó, bạn có thể sử dụng FileZilla để đổi tên thư mục.


0

Sử dụng trình duyệt tệp như Midnight Commander (văn bản), Nautilus (Gnome) hoặc Cá heo (KDE) để làm việc với thư mục.


0

để làm việc với các thư mục (hoặc tệp) có tên lạ / khó gõ:

1) Chạy ls -iđể khám phá inode của tập tin.

Đây lstùy chọn sẽ cung cấp cho bạn mỗi tên của tập tin, và một định danh cho tập tin này trên hệ thống tập tin (inode)

2) Sử dụng find để chạy lệnh trên tệp

nói rằng inode là 9961926

bạn có thể chạy

 find * -prune -inum 9961926 -exec rm -i {} \;

xóa tập tin

hoặc là

 find * -prune -inum 9961926 -exec mv {} other-name \;

để chuyển nó sang một cái tên tốt hơn

hoặc thậm chí

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

để đặt tên mới trong khi vẫn giữ tên cũ

(có lẽ, bạn cũng có thể chạy các lệnh khác. Thật không may, tôi không thể sử dụng dòng này để chạy a cd)

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.