ไฟล์สองไฟล์ในหนึ่งในโฟลเดอร์ของฉันจะมีชื่อเหมือนกันได้อย่างไร


12

ฉันดาวน์โหลดสองไฟล์พวกเขาทั้งสองถูกบันทึกไว้ในชื่อไฟล์เดียวกันจากนั้นฉันก็โอนไฟล์เหล่านั้นด้วย scp ไปยังคอมพิวเตอร์เครื่องอื่น

ทำไมพวกเขาถึงไม่กลายเป็นหนึ่งในนั้นเมื่อวินาทีที่ถูกบันทึกไว้?


2
คุณสามารถแสดงผลลัพธ์ของls -laโปรดได้ไหม
ryekayo

2
ยังดีกว่าls -lb(หรือls -labถ้าชื่อขึ้นต้นด้วย.)
G-Man กล่าวว่า 'Reinstate Monica'

1
นอกจากนี้เกิดอะไรขึ้นกันแน่? คุณดาวน์โหลดdir1/fooและdir2/fooบน machine X ดังนั้นscpพวกเขาจึงไปdir42ที่เครื่อง Y และพวกเขาออกมาเป็นไฟล์แยกต่างหากที่มีชื่อเดียวกันหรือไม่ หรือคุณดาวน์โหลดสองไฟล์ที่มีชื่อเดียวกันลงในไดเรกทอรีเดียวกัน (บนเครื่อง X) และพวกเขาออกมาเป็นไฟล์แยกต่างหากที่มีชื่อเดียวกันหรือไม่
G-Man กล่าวว่า 'Reinstate Monica'

คำตอบ:


39

บางทีพวกเขาดูเหมือนว่าพวกเขาจะมีชื่อเดียวกัน

ลอง:

$ touch Stéphane Stéphane Stéphane\  St​éphane
$ ls -1
Stéphane
Stéphane
St​éphane
Stéphane 

พวกเขาดูเหมือนกันมาก

$ ls -1b
Stéphane
Stéphane
St​éphane
Stéphane\ 

ดีขึ้นเล็กน้อย. อักขระช่องว่างถูกตั้งค่าสถานะเป็น\ (แม้ว่าlsการใช้งานไม่ได้ทั้งหมดทำอย่างนั้น)

$ LC_ALL=C ls -1b
Ste\314\201phane
St\303\251phane
St\303\251phane\ 
St\342\200\213\303\251phane

ตอนนี้เรากำลังพูดถึง (อักขระที่ไม่ใช่ ASCII ทั้งหมดจะแสดงผลเป็นค่าฐานแปดขององค์ประกอบไบต์ของพวกเขา)

คุณสามารถทำได้และใช้งานได้กับอินพุตใด ๆ :

$ ls | LC_ALL=C sed -n l
Ste\314\201phane$
St\303\251phane$
St\342\200\213\303\251phane$
St\303\251phane $

ที่นี่จุดสิ้นสุดของเส้นถูกทำเครื่องหมายด้วย$ซึ่งทำให้ง่ายต่อการมองเห็นพื้นที่ต่อท้าย อย่างไรก็ตามนั่นจะไม่ช่วยในการจำไฟล์ที่เรียกว่าStéphane<newline>Stéphane

$ ls | perl -Mopen=locale -MUnicode::UCD=charinfo -lpe '
       s/[^\41-\177]/"<".charinfo(ord$&)->{name}.">"/ge'
Ste<COMBINING ACUTE ACCENT>phane
St<LATIN SMALL LETTER E WITH ACUTE>phane
St<ZERO WIDTH SPACE><LATIN SMALL LETTER E WITH ACUTE>phane
St<LATIN SMALL LETTER E WITH ACUTE>phane<SPACE>

ทำให้ชัดเจนว่าเกิดอะไรขึ้น

ดูคำตอบอื่น ๆเพิ่มเติมสำหรับเรื่องนี้


1
หากคุณไม่รังเกียจที่ฉันถาม Stephane คำสั่ง piped LC_ALL=C sed -n 1จะทำอย่างไร
ryekayo

3
sed's lคำสั่งแสดงการป้อนข้อมูลในรูปแบบที่ชัดเจนสายตา ด้วย LC_ALL = C เราตรวจสอบให้แน่ใจว่ามันใช้เฉพาะอักขระ ASCII สำหรับสิ่งนั้น (แม้ว่าอย่างน้อยกับ GNU sedก็ไม่จำเป็น)
Stéphane Chazelas

2
@ StéphaneChazelasคุณสามารถใช้:LC_ALL=C ls -b
vinc17

@ vinc17 จุดดีนั่นก็ยังดีกว่าที่จะอ่านไฟล์ที่มีอักขระขึ้นบรรทัดใหม่ แต่ก็ไม่เสมอไปที่จะตรวจสอบพื้นที่การต่อท้าย ฉันได้เพิ่มไปยังคำตอบ
Stéphane Chazelas

ประณาม TIL ที่คุณสามารถมีช่องว่างที่ท้ายชื่อไฟล์และดูเหมือนว่ามีไฟล์ชื่อเหมือนกันสองไฟล์ในระบบไฟล์! คำตอบที่ดีls | LC_ALL=C sed -n lจริง ๆ แล้วเป็นการประหยัดครั้งใหญ่ในตอนนี้ขอบคุณ!
Elijah Lynn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.