ไปที่ไดเรกทอรีที่มีชื่อที่ไม่รู้จัก


8

ขณะทำการแกะกล่อง tarball ฉันพบไดเรกทอรีซึ่งlsรายงานว่าเป็น "????????????????????" สันนิษฐานว่าชื่อไม่ได้อยู่ใน Unicode หรือไม่? อย่างไรก็ตามฉันไม่สามารถหาวิธีเข้าถึงโฟลเดอร์ได้ ฉันพยายามcd $(find -inum inode_number)แล้ว แต่นั่นก็ทำให้ฉัน

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

มีวิธีอื่นในการเข้าถึงโฟลเดอร์โดยตรงด้วยหมายเลข inode หรือไม่


มันอาจเป็นศัพท์แรกในรายการไดเรกทอรี? จากนั้นcd */อาจใช้งานได้ *ควรขยายคำอธิบายที่เข้าใจได้ของไดเรกทอรีของเชลล์และcdละเว้นอาร์กิวเมนต์เพิ่มเติม อีกวิธีหนึ่งอาจใช้ตัวจัดการไฟล์กราฟิก (รวมถึง MC ตามเทอร์มินัล) หรือตัวนำทางทรีของไฟล์ในตัวเช่น Vim นอกจากนี้คุณยังสามารถทดลองใช้-execสวิตช์เป็นfind, not with cd` โดยตรง (ซึ่งเป็นเชลล์ในตัว) แต่มีเช่นlsและเครื่องมืออื่น ๆ
Daniel Andersson

@Daniel: ในบางเชลล์ที่cdมีอาร์กิวเมนต์หลายตัวล้มเหลว
สกอตต์

@Scott: จริง POSIX ไม่ได้ระบุพฤติกรรมของหลายข้อโต้แย้ง Bash และ Dash ละเว้นอาร์กิวเมนต์พิเศษ csh ออกด้วย " too many arguments"
Daniel Andersson

คำตอบ:


3

วิธีการทั่วไปในการใช้งานไดเรกทอรีใด ๆ (หรือไฟล์) คือการใช้หมายเลขไอโหนด

ก่อนอื่นให้ใช้ ls เพื่อรับ inode ของโฟลเดอร์ที่เป็นปัญหา:

ls -lia
  • -l สำหรับรายชื่อยาว (ไม่จำเป็น)
  • -i เพื่อรับค่า inode
  • -a เพื่อดูไฟล์ทั้งหมดแม้กระทั่งไฟล์ที่ซ่อนอยู่ (ตัวเลือก)

ในรายชื่อคุณจะเห็นตัวเลขยาวในคอลัมน์แรกดังนี้:

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

ตอนนี้คุณสามารถเปลี่ยนเป็นไดเร็กทอรีนั้นโดยใช้:

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

... แต่ทดแทน ###### ด้วยหมายเลขที่ยาวที่คุณได้รับในรายการไดเรกทอรี

cdแน่นอนคำสั่งไม่จำเป็นต้องเป็น มันอาจจะเป็นrm, cp, mv, ฯลฯ ...


2

เนื่องจากตัวละครน่าจะเป็นตัวอักษรสากลจึงน่าจะปรากฏเป็นรหัสควบคุมในชุดอักขระ en_US ของคุณซึ่งเป็นสาเหตุที่ ls แสดงเป็นเครื่องหมายคำถาม

อาจเกิดจากการที่คุณเลือกใช้ alias'ing ls เป็นค่าเริ่มต้นในโปรไฟล์ส่วนกลาง ตัวอย่างเช่น:

alias ls='ls -q'

คุณสามารถดูว่าการกระจายของคุณทำได้โดยการพิมพ์ลงในเปลือกของคุณ:

alias ls

ซึ่งจะพิมพ์ออกมาดังนี้:

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

หน้าที่ลิงก์ด้านล่างแนะนำว่าถ้าคุณทำ "ls -b" คุณจะเห็นรหัสควบคุมฐานแปดเพื่อให้คุณรู้ว่าอย่างน้อยอักขระที่ใช้งานอยู่

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

สมมติว่าใช้งานไม่ได้คุณมีตัวเลือกอื่นที่กล่าวถึงอยู่ใกล้กับด้านล่าง:

เครื่องมือที่ฉันไม่รู้จนกระทั่งบัดนี้เรียกว่า OctalDump (บน Debian - / usr / bin / od)

$ ls | od -b

จะแสดงรูปแบบแปดของรหัสควบคุม

$ ls | od -c

จะแสดงตัวอักษรรวมถึงช่องว่างเพิ่มเติมใด ๆ ที่ซ่อนอยู่ซึ่งอาจเป็นที่สิ้นสุด (โปรดสังเกตช่องว่างเพิ่มเติมในตอนท้ายในตัวอย่าง

เมื่อคุณรู้ว่าตัวละครควบคุมนั้นกำลังเล่นอยู่หรือไม่และมีช่องว่างที่ซ่อนอยู่เพิ่มเติมคุณอาจจะสามารถ finagle วิธีในการ cd ไปยังไดเรกทอรีโดยการหนีจากตัวควบคุม ความล้มเหลวนั้นคุณมีสองสามตัวเลือกในการเปลี่ยนชื่อไดเรกทอรี

หน้าข้างบนยังสะดวกมีวิธีที่รวดเร็วและสกปรกสำหรับการลบตัวควบคุมผ่านคำสั่ง mv ซึ่งฉันคิดว่าจะใช้งานได้ตราบใดที่คุณหนีออกจากพื้นที่ แต่อย่าหลบเครื่องหมายคำถาม อักขระตัวแทน) และตราบใดที่ไม่มีสิ่งใดในไดเรกทอรีที่ไดเรกทอรีโกงนี้อยู่ เหตุผลสำหรับข้อกำหนดที่ชัดเจนเหล่านี้เป็นเพราะคุณใช้อักขระตัวแทนและพื้นที่เดียวดังนั้นคุณจึงไม่ต้องการให้อักขระตัวแทนตรงกับไฟล์หรือไดเรกทอรีอื่น ๆ โดยไม่ได้ตั้งใจ

หากวิธีการด้านบนใช้ไม่ได้ผลคุณสามารถใช้วิธีการค้นหาที่กล่าวถึงโดยการตอบกลับอื่น ๆ ได้อย่างมั่นใจในวิธีอื่น แทนที่จะลอง cd ไปยังไดเรกทอรีโดยใช้หมายเลข inode ซึ่งเป็นสิ่งที่คุณบอกว่าคุณได้ลองแล้วคุณสามารถเปลี่ยนชื่อได้โดยใช้หมายเลข inode เพียงให้แน่ใจว่าได้คัดลอกทั้ง3บรรทัดสำหรับคำสั่งนั้นจากหน้าข้างบน (แทนที่ส่วน "ที่ต้องการชื่อ" ด้วยชื่อจริงที่คุณต้องการเปลี่ยนชื่อเป็นอย่างไรก็ตาม)

เมื่อเปลี่ยนชื่อไดเรกทอรีแล้วคุณควรจะสามารถเข้าถึงได้ ฉันหวังว่ามันจะไม่มีไฟล์ที่มีรหัสควบคุมในชื่อมิเช่นนั้นคุณจะต้องล้างและทำซ้ำสำหรับทุกไฟล์ (และ / หรือไดเรกทอรีย่อย) ในไดเรกทอรีที่คุณเพิ่งเปลี่ยนชื่อซึ่งเป็นจุดที่ลูปจะ อาจเป็นการฉลาดที่จะตั้งชื่อทุกไฟล์เป็นตัวเลขโดยเพิ่มจาก 1 :-)


0

"?" มีความหมายพิเศษในเปลือกหมายถึง "ตัวละครใด ๆ รวมถึงไม่มี" ดังนั้นหากไฟล์ของคุณมีชื่อว่า "????????????????????" คุณอาจต้องหลบหนีจาก "?" (และช่องว่าง toos) ดังนั้นคุณสามารถลองบางอย่างเช่น cd \? \? \? \? \? \? \? \? \? \? \? (ถ้าคุณยังไม่ได้ลอง)

นั่นคือสมมติว่ามีใครบางคนจงใจให้ชื่อไฟล์ที่ยุ่งยากหากว่าการเข้ารหัสที่อ่านไม่ออก / เสียหาย / ผิดกฎหมาย


1
แต่โปรดจำไว้ว่าlsชอบที่จะแสดงอักขระที่ไม่ใช่ ASCII (≥0x7F) เป็น?–– ดังนั้นชื่อไดเรกทอรีอาจไม่ใช่แค่เครื่องหมายคำถาม
สกอตต์

0

lsทำ มีอะไรในไดเรกทอรี (ไฟล์หรือไดเรกทอรีย่อย) ที่มีชื่อยาวกว่าไดเรกทอรีย่อยลึกลับของคุณ (ซึ่งคือ 21, ถ้า“ ??????????????????????” คือ ที่ถูกต้อง) จากนั้นเปลี่ยนชื่อเป็นชื่อที่สั้นกว่าหรือย้ายไปไว้ในไดเรกทอรีอื่น จากนั้นพิมพ์

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

อักขระตัวแทน (เครื่องหมายคำถาม 20 ข้อตามด้วยเครื่องหมายดอกจัน) ควรตรงกับชื่อใด ๆ ที่มีความยาว 20 ตัวอักษรหรือนานกว่า - และคำแนะนำแรกที่ฉันให้ควรยืนยันว่าไดเรกทอรีย่อยของคุณเป็นสิ่งเดียวที่ตรงกับรูปแบบนั้น แต่มันอาจมีประโยชน์มากกว่าที่จะทำ

mv ????????????????????* new_name


3
มันอาจจะเป็นประโยชน์ในการทำงานlsกับอย่างใดอย่างหนึ่ง--quoting-style=shellหรือ--quoting-style=escapeตัวเลือกที่จะบังคับให้ผลิตรุ่นที่หนีออกมาได้อย่างถูกต้องของชื่อไฟล์ว่า
Dan D.

1
@DanD +1 สำหรับตัวเลือกที่ยอดเยี่ยมที่ฉันไม่รู้ ฉันมักจะใช้ตัวจัดการไฟล์ gui เมื่อสิ่งนี้จะต้องได้รับการจัดการ แต่มันอาจมีประโยชน์ถ้าฉันต้องทำงานจากคอนโซลหรือภายในสคริปต์
Joe

0

วิธีง่ายๆในการดูว่ามีอะไรอยู่ในนั้นคือ FTP ไปยังเครื่องด้วย FileZilla จากนั้นคุณสามารถใช้ FileZilla เพื่อเปลี่ยนชื่อไดเรกทอรี


0

ใช้เบราว์เซอร์ไฟล์เช่น Midnight Commander (ข้อความ), Nautilus (GNOME) หรือ Dolphin (KDE) เพื่อทำงานกับไดเรกทอรี


0

เพื่อทำงานกับไดเรกทอรี (หรือไฟล์) ที่มีชื่อแปลก / ยากที่จะพิมพ์:

1) เรียกใช้ls -iเพื่อค้นหา inode ของไฟล์

lsตัวเลือกนี้จะให้แต่ละชื่อไฟล์และตัวระบุสำหรับไฟล์นี้ในระบบไฟล์ (inode)

2) ใช้ find เพื่อรันคำสั่งในไฟล์

บอกว่า inode คือ 9961926

คุณสามารถเรียกใช้

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

เพื่อลบไฟล์

หรือ

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

เพื่อย้ายไปยังชื่อที่ดีกว่า

หรือแม้กระทั่ง

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

เพื่อให้ชื่อใหม่ในขณะที่ยังคงชื่อเดิม

(สมมุติว่าคุณสามารถเรียกใช้คำสั่งอื่นได้เช่นกันโชคไม่ดีที่ฉันไม่สามารถใช้บรรทัดนี้เพื่อเรียกใช้กcd)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.