การลบไฟล์จำนวนมากใน Windows


141

ฉันมีไดเรกทอรีที่มี ~ 3 ล้านไฟล์ในไดเรกทอรีย่อยบางแห่งบนเซิร์ฟเวอร์ Windows 2008 การลบไฟล์ด้วยตนเองผ่าน SHIFT + DEL บน root dir ใช้เวลานาน มีวิธีอื่นใดที่จะทำการลบอย่างรวดเร็ว ?


1
ถามด้วยที่นี่ที่ Stack Overflow: stackoverflow.com/questions/186737/…
Hugo

6
ฉันจะกำหนดเป้าหมายแม่เหล็กไปยังไดเรกทอรีย่อยบางตัวเท่านั้นได้อย่างไร
Jaime Hablutzel

7
@ Jaime ด้วยมือที่มั่นคงเหมือนโปรแกรมเมอร์ตัวจริง ... ;-) xkcd.com/378
Legionair

เกิดอะไรขึ้นถ้ามันเป็นไดรฟ์ SSD
Benjamin Weiss

คำตอบสำหรับ powershell: stackoverflow.com/questions/1752677/..
Warlike Chimpanzee

คำตอบ:


179

คำเตือน: ถ้าคุณมี symlink ไปยังไดเรกทอรีแล้วdelจะลบไดเรกทอรีจริงไม่ใช่ symlink ระมัดระวังด้วยสิ่งนี้และอย่ารันคำสั่งเหล่านี้จนกว่าคุณจะรู้ว่าไม่มีสัญลักษณ์เชื่อมโยงในไดเรกทอรีเป้าหมาย


ฉันต้องลบไฟล์และไดเรกทอรีจำนวนมากออกจากไดรฟ์เข้ารหัส WinXP โดยทั่วไปจะมีไฟล์ประมาณ 22 GB จาก 500,000 ไฟล์ในโฟลเดอร์ 45,000 โฟลเดอร์

การลบด้วย Windows Explorer นั้นเป็นขยะเพราะเสียเวลามากมายในการระบุไฟล์ ฉันมักจะย้ายสิ่งที่ฉันจำเป็นต้องลบ C: \ stufftodelete และมีไฟล์ deletestuff.bat rmdir /s/q C:\stufftodeleteชุดไป นี่เป็นกำหนดการวิ่งในตอนกลางคืน แต่บางครั้งฉันก็ต้องวิ่งในตอนกลางวันเพื่อให้เร็วขึ้น

นี่คือผลลัพธ์ของการทดสอบเวลาอย่างรวดเร็วของตัวอย่างขนาดเล็ก 5.85 MB จากไฟล์ 960 ไฟล์ใน 303 โฟลเดอร์ ฉันใช้วิธีที่ 1 ตามด้วยวิธีที่ 2 จากนั้นรีเซ็ตไดเรกทอรีการทดสอบ

วิธีที่ 1 ลบไฟล์และโครงสร้างไดเรกทอรีในหนึ่งรอบ:

rmdir /s/q foldername

วิธีที่ 2 มีการส่งผ่านครั้งแรกเพื่อลบไฟล์และส่งออกไปยัง nul เพื่อหลีกเลี่ยงค่าใช้จ่ายในการเขียนไปยังหน้าจอสำหรับไฟล์ singe ทุกไฟล์ การผ่านครั้งที่สองจากนั้นทำความสะอาดโครงสร้างไดเรกทอรีที่เหลืออยู่:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • วิธีที่ 1: 17.5s, 14.9s, 13.9s, 14.8s, 13.8s: เฉลี่ย14.98 วินาที
  • วิธีที่ 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: เฉลี่ย12.82 วินาที

นี่คือผลลัพธ์ของการทดสอบอื่นโดยใช้ 404 MB จาก 19,521 ไฟล์ใน 3,243 โฟลเดอร์:

  • วิธีที่ 1: 2 นาที 20 วินาที
  • วิธีที่ 2: 2 นาที 33 วินาที

ดังนั้นจึงมีไม่มากในมันอาจใกล้เกินไปที่จะตัดสินในการทดสอบครั้งเดียว


แก้ไข: ฉันได้ทดสอบซ้ำกับข้อมูลจำนวนมากนี่เป็นกรณีปกติสำหรับฉัน: 28.3 GB จาก 1,159,211 ไฟล์ใน 146,918 โฟลเดอร์:

  • วิธีที่ 1: 2h 15m, 2h 34m: เฉลี่ย: 2 ชั่วโมง 25 นาที
  • วิธีที่ 2: 49m, 57m: เฉลี่ย: 53 นาที

ว้าววิธีที่ 2 เร็วกว่าวิธีที่ 1 เกือบสามเท่า! ฉันจะอัปเดต deletestuff.bat ของฉัน!


RD / S / Q ใช้งานได้ดีถ้าคุณระบุพา ธ สัมบูรณ์ แต่จะไม่ทำงานเมื่อทำงานกับพา ธ สัมพัทธ์ มีวิธีแก้ไขไหม?
Michael S.

1
@Hugo: ฮิวโก้คำถาม: ในการทดสอบหมดเวลาข้างต้นสำหรับวิธีการอย่างใดอย่างหนึ่งหรือทั้งสองอย่างคุณไม่นับไฟล์ทันทีก่อนที่จะใช้วิธีการหรือไม่ ฉันถามเพราะเนื้อหาของโฟลเดอร์อาจอยู่ในแคชไฟล์ OS อยู่แล้ว ขอบคุณ!
วิลเลียม C

@ WilliamC: ฉันจำไม่ได้ แต่สำหรับการลบซ้ำที่มีเนื้อหาเดียวกันฉันจะนับทันทีก่อนที่จะลบเพียงครั้งเดียวและจะไม่ทำซ้ำสำหรับการลบอื่น ๆ (เพราะฉันรู้ตัวเลขแล้ว)
Hugo

1
ทั้ง rmdir และ del ล้มเหลวเมื่อมีชื่อพา ธ ที่ยาวเกิน 256 อักขระ
Nicolai Ehemann

1
คำเตือน:ถ้าคุณมี symlink ไปยังไดเรกทอรีแล้วdelจะลบไดเรกทอรีจริงไม่ใช่ symlink ระมัดระวังด้วยสิ่งนี้และอย่ารันคำสั่งเหล่านี้จนกว่าคุณจะรู้ว่าไม่มีสัญลักษณ์เชื่อมโยงในไดเรกทอรีเป้าหมาย
user0103

18

หากคุณต้องลบทรีไดเรกทอรีขนาดใหญ่อย่างสม่ำเสมอให้พิจารณาการจัดเก็บรูทของทรีไดเรกทอรีนั้นในพาร์ติชันแยกต่างหากจากนั้นเพียงฟอร์แมตแบบด่วนทุกครั้งที่คุณต้องการลบทุกอย่าง หากคุณต้องการทำให้สิ่งนี้เป็นแบบอัตโนมัติคุณสามารถใช้คำสั่ง DOS นี้:

echo Y | format Z: /FS:NTFS /X /Q

โดยที่ Z: เป็นพาร์ติชัน 'ระเหย' ของคุณ หมายเหตุ: พาร์ติชันต้องไม่มีป้ายชื่อ ฉัน blogged เกี่ยวกับเรื่องนี้ที่นี่


และใช้ฮาร์ดลิงก์เพื่อสร้างการเชื่อมต่อระหว่างดิสก์และไดเรกทอรีที่จัดเก็บไฟล์หากต้องการเส้นทางไดเรกทอรีที่แน่นอน
Nime Cloud

1
@NimeCloud: ฮาร์ดลิงก์ไม่สามารถข้ามระบบไฟล์หรือไดเรกทอรีลิงก์ได้
grawity

5
อย่างไรก็ตามลิงก์สัญลักษณ์สามารถข้ามระบบไฟล์และไดเรกทอรีลิงก์ดังนั้นจึงอาจเหมาะสมที่นี่ ดูคำสั่ง mklink (Vista และหลังจากนั้นมิฉะนั้นให้ใช้ทางแยกจาก Mark Russinovich / SysInternals)
Robert Calhoun

9

ในคอมมานด์พรอมต์ (Start -> Run -> cmd):

del /f /s /q foldername 

นี่เป็นสิ่งที่ยอดเยี่ยมเพราะมันแสดงรายการการลบ .. แต่มันเหมือนกับ rd ในแง่ของความเร็ว
bobobobo

1
โอ้ว้าวะว้าวะว้า ไม่ดีอย่างที่คิด มันจะลบไฟล์อย่างรวดเร็ว แต่จะทำให้ทรีไดเรกทอรียังคงอยู่
bobobobo

1
ซึ่งฉันอาจเพิ่มใช้เวลาค่อนข้างนานในการล้างออกโดยใช้ RD
bobobobo

3
@bobobobo ฉันได้ทดสอบบางอย่างกับ ~ 30GB / 1,000,000 ไฟล์ / 15,000 โฟลเดอร์และเดล + ถเกือบสามครั้งเร็วกว่าเพียง RD: superuser.com/questions/19762/mass-deleting-files-in-windows/...
ฮิวโก้

1
สิ่งนี้จะล้มเหลวหากชื่อพา ธ ยาวกว่า 256 ตัวอักษร
Nicolai Ehemann

7

นอกเหนือจากการคัดลอก / ย้ายไฟล์อย่างรวดเร็ว (โดยใช้ API ของตัวเอง) TeraCopy ยังสามารถลบไฟล์และมันก็เร็วมากเช่นกัน นับตั้งแต่ค้นพบ TeraCopy ฉันจะไม่ใช้คอมพิวเตอร์โดยไม่ได้ติดตั้ง (ถ้าฉันจะคัดลอก / ย้าย / ลบ)

โปรแกรมติดตั้งตัวเดียวกันนั้นติดตั้งรุ่น x64 แต่คุณต้องบังคับด้วยตนเอง

เบต้าที่ฉันแนะนำให้ใช้กับเวอร์ชั่นเสถียร: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/


คุณเคยทำหรือเคยเห็นการเปรียบเทียบเวลาเหมือน TeraCopy กับ rmdir หรือ del หรือ del + rmdir บ้างไหม?
Hugo

1
@Hugo: คำถามโง่ ฉันจะไม่แนะนำ TeraCopy ถ้ามันไม่สามารถมองเห็นได้ด้วยตาเปล่ามันเร็วกว่า!
rautamiekka

5
คุณคาดว่าจะเร็วกว่า 10% หรือไม่ เร็วเป็นสองเท่า? เร็วกว่าสิบเท่า? เร็วขึ้นเป็นล้านเท่าหรือ มันจะดีถ้าคุณสามารถใช้กับ rmdir ด้วยชุดทดสอบที่มีขนาดใหญ่และเหมือนกันสองชุด
Hugo

1
ขอขอบคุณ! ฉันใช้ TeraCopy มาหลายปีแล้ว แต่ไม่เคยรู้เรื่องฟังก์ชั่นการลบแบบกลุ่ม และคุณพูดถูกมันเร็วกว่ามาก!
AzDayton

1
@Amalgovinus คุณทำไม่ได้ คุณเปิดโปรแกรมและเพิ่มไฟล์ / โฟลเดอร์ผ่านการลากหรือคลิกขวาหรือคลิกขวาที่ไฟล์ / โฟลเดอร์ใน Explorer / บนเดสก์ท็อป เมื่อดำเนินการเสร็จแล้วให้คลิก 'ลบ' และ 'ย้ายไปยังถังรีไซเคิล' หากคุณต้องการ แต่ฉันชอบ 'ลบจากดิสก์' อย่างไรก็ตามคุณจะต้องบู๊ต TeraCopy ในฐานะผู้ดูแลระบบเพื่อให้มันปรากฏขึ้นในเดสก์ท็อป / Explorer คลิกขวาหากไม่ได้ทำตามค่าเริ่มต้น
rautamiekka

6

ฉันทำไฟล์ bat ที่ทำเช่นเดียวกัน

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

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


วิธีใช้งาน บันทึกเป็น delfolder.bat ในเส้นทางของเส้นทาง (เช่น c: \ windows) จากนั้นเรียกใช้เป็น

 delfolder "foldername"   

โดยที่ foldername เป็นชื่อของโฟลเดอร์

ในการทดสอบของฉันการลบไฟล์ 123'000 นั้นใช้เวลา 3 นาที (sata 7200rpm) เย้!


1
โดยปกติแล้วคุณไม่ควรใช้%1สคริปต์ แต่"%~1"อย่างใด วิธีนี้ถ้าอาร์กิวเมนต์ได้รับการส่งผ่านด้วยคำพูดมันจะถูกยกออกและขอ หากยังไม่ได้ส่งผ่านด้วยเครื่องหมายคำพูดก็จะถูกยกมา
เบอนัวต์

4

การใช้รหัสด้านล่างมักใช้งานได้ดีสำหรับฉัน

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe

เพิ่ม `> nul` ลงในส่วนท้ายของการเรียก robocopy นั้นเพื่อที่คุณจะได้ไม่ต้องเห็นมันบนหน้าจอ
JoshDM

มันคล้ายกับการใช้งานrsyncใน Linux มันเร็วขึ้นแล้วrmdirใช่ไหม
Hastur

FYI robocopy นี้แตกต่างจากdel /f/q/s+ rmdir /s/qมาก หาก dir_to_wipe ของคุณมีอีเมลขยะc:\some_important_dirคุณจะต้องสูญเสียข้อมูลของคุณ
Pavel P

@Pavel แล้วใช้ / XJ เพื่อแยกจุดเชื่อมต่อและลิงก์สัญลักษณ์?
แบร์นฮาร์ด

นี่เป็นการหลอกลวงสำหรับไดเรกทอรี ~ 36GB ที่มีหลายร้อยไดเรกทอรีและไฟล์ที่มีอักขระมากกว่า 256 ตัวทำให้ del / rmdir "method" ล้มเหลวอย่างน่าสังเวช ใช้เวลาไม่กี่วินาที Windows Explorer ประมาณชั่วโมง!

3

ใช้คำสั่ง rd / sจากพรอมต์คำสั่ง


2
ไม่ได้นี่มันช้าเท่ากับการลบจาก explorer
bobobobo

เอาล่ะค่ะ ทำงานได้ดีกว่า del / f / s / q
bobobobo

3
นี่มันดีกว่าการใช้ Explorer ในการลบจริงๆ มันยังคงลบแม้ว่าลบหรือสองจะล้มเหลว (ที่สำรวจฉายาและถูกยกเลิก)
bobobobo

2

ทางออกที่ดีที่สุดน่าจะเป็นการย้ายโฟลเดอร์ออกจากที่ใดที่หนึ่ง (เช่นถังรีไซเคิล) จากนั้นเริ่มลบมัน มันจะใช้เวลานาน แต่อย่างน้อยมันก็จะออกนอกทาง

ฉันค่อนข้างมั่นใจว่าเวลาที่ใช้ในการลบไฟล์ทั้งหมดนั้นเป็นความต้องการโดยธรรมชาติของงานไม่ใช่ความไร้ประสิทธิภาพในการดำเนินการลบ


1

ติดตั้งCygwinและใช้-r RM แต่นั่นก็น่าจะเกินกำลัง


นั่นคือว่าเช่นเดียวกับrd /q /s...
โจอี้

งานมากเกินไปและความเร็วเกือบเท่ากัน!
adeelx

1
มันไม่ได้แย่ไปกว่าคำตอบ install-tool-X-and-use-it อื่น ๆ ที่นี่และไม่ควรลงคะแนนหากไม่ได้เป็น
JdeBP

2
cygwin rmเร็วกว่า cmd.exe rdหรือไม่ เนื่องจากการจำลอง cygwin ของอินเทอร์เฟซ posix ค่อนข้างช้าตามที่ต้องการทำงานพิเศษบางอย่างซึ่งrmไม่ได้ชื่นชมจริง ๆ
Jan Hudec

ขณะที่รอคอลเลกชันขนาดใหญ่ของไฟล์ที่จะลบผมมีเวลามากพอที่จะติดตั้ง Cygwin rm -rfและพยายาม ในเวลาประมาณ 10 นาทีฉันถูกยกเลิกและกลับไปdel /f/s/qเพราะภายใต้ Cygwin การใช้ดิสก์เพียง 50% ภายใต้delการใช้ดิสก์ถูกตรึงที่ 100% ดังนั้นฉันคิดว่ามันจะต้องลบได้เร็วขึ้น การใช้ CPU คือ <1% สำหรับทั้งสองวิธี ฉันไม่แน่ใจเกี่ยวกับหมายเลขไฟล์เพราะฉันปิด Windows File Deleter หลังจากใช้เวลาในการคำนวณ 10 นาที
Derek Ziemba

1

คุณเปิดใช้งานการสร้างชื่อไฟล์สั้น ๆ หรือไม่? ถ้าเป็นเช่นนั้นคุณต้องการมันจริงเหรอ? การลบไฟล์เป็นเพียงเมตาดาต้า opeartion ดังนั้นหากคุณมีจำนวนชื่อที่จะลบสองเท่าจำนวนงานจะสูงขึ้นอย่างมีนัยสำคัญ


0

คุณลองทั้งสองแอพทั้งสองนี้หรือไม่?

ตรวจสอบให้แน่ใจว่าตั้งค่าจำนวนการเขียนทับเป็น 0 หากคุณต้องการประสิทธิภาพที่เร็วที่สุด ทำได้โดยคลิกตัวเลือกจากนั้นเปลี่ยนค่าที่ด้านล่างของกล่องโต้ตอบ

ป้อนพา ธ ที่จะลบในฟิลด์แหล่งที่มาแล้วคลิกลบ

แอพเหล่านี้ไม่ได้ใส่ไฟล์ลงในถังรีไซเคิล ใช้ด้วยความระมัดระวัง


0

นี้มีไว้เพื่อชมเชยและเพิ่มขั้นตอนในคำตอบที่กล่าวถึงก่อนหน้านี้

วิธีการสองข้อที่กล่าวมาข้างต้นนั้นค่อนข้างมีประสิทธิภาพ แต่การตรวจสอบประสิทธิภาพนั้นทำได้ยากเว้นแต่ว่าจะถูกเปรียบเทียบกับเงื่อนไขเดียวกัน:

  • อุปกรณ์และรุ่นของฮาร์ดไดรฟ์ทางกายภาพ
    • ควรเปรียบเทียบกับ ATTO / Crystal Disk ก่อนทำการโคลนข้อมูล
  • พาร์ทิชันเดียวกัน / ปริมาณที่ตั้งและรูปทรงเรขาคณิต
    • วิธีการทำเช่นนี้จะทำการ defrag พาร์ติชั่น / โฟลเดอร์ตัวอย่างและทำการโคลนนิ่งพวกเขาให้ตรงตามที่พวกเขาเป็น 2 ประเภทเดียวกันของฮาร์ดไดรฟ์ (จากขั้นตอนก่อนหน้า)
  • จากนั้นดำเนินการกำหนดค่าผ่าน Batch File และใช้ Powershell Cmdlet เพื่อบันทึกและวัดประสิทธิภาพ

    • เป็นการดียิ่งเพิ่มกลไกบางอย่างเพื่อป้องกันอคติแคชใด ๆ เนื่องจากความใหม่ของกิจกรรมที่คล้ายกัน
  • ต่อไปนี้เป็นโฟลเดอร์ตัวอย่างบางส่วน (ตั้งชื่อเป็นขนาดรวม) ที่ฉันทดลอง แต่ไม่สามารถรับผลการทดสอบ / ข้อสรุปใด ๆ ได้

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • ฉันได้โพสต์ไฟล์บันทึกผลลัพธ์ แต่ฉันเชื่อว่าความแปรปรวนมีขนาดใหญ่มากเนื่องจากขนาดและการกระจายของไฟล์โฟลเดอร์ ฯลฯ

Powershell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt

ล้มเหลวด้วยชื่อ> 256 ตัวอักษร

0

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

del /f /s /q /a foldername > nul
rmdir /s /q foldername

เกี่ยวกับไฟล์ BAT โดยMagallanesให้ระวังอย่างมากกับ takeown และ icacls ทำให้ hardlinks แชร์สิทธิ์และเจ้าของเดียวกันดังนั้นหากมีhardlinks ที่ไม่อิ่มตัวในโฟลเดอร์ที่คุณต้องการลบการใช้ takeown และ icacls จะเปลี่ยนการอนุญาตและเจ้าของไฟล์ภายนอก แฟ้ม.

การใช้เครื่องมือln.exeคุณสามารถแสดงรายการไฟล์ทั้งหมดที่ฮาร์ดลิงก์ภายในโฟลเดอร์และรู้ว่าไฟล์นั้นเชื่อมโยงไปยังไฟล์ที่อยู่นอกโฟลเดอร์ ( ฮาร์ดลิงก์ที่ไม่อิ่มตัว) หรือไม่:

ln.exe --enum foldername > HardlinksList.txt

-1

การลบโฟลเดอร์เร็วกว่าการลบหลายไฟล์

ดังนั้นหากคุณต้องการใช้เม้าส์แทนการใช้ command prompt คุณสามารถสร้างไดเร็กตอรี่ย้ายไฟล์ไปที่นั่นแล้วลบมัน (ด้วย Shift + Del ตามที่คุณพูด)


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

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