วิธีจับคู่ * กับไฟล์ที่ซ่อนอยู่ในไดเรกทอรี


21

วิธีจับคู่ไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่กำหนด

ตัวอย่างเช่น

ถ้าฉันให้คำสั่งด้านล่างมันไม่ได้ให้ผลลัพธ์ของไฟล์ที่ซ่อนอยู่

 du -b maybehere*/*

วิธีการทำให้ง่าย ๆ นี้โดยใช้คำสั่งเดียวแทนที่จะใช้

du -b maybehere*/.* maybehere*/*

เพราะฉันต้องพิมพ์บางทีสองครั้ง


ลองเพียงซ่อนmaybehere*/.*และผนวกกับข้างต้นทั้งหมด
Costas

1
การแก้ไขของคุณสร้างคำถามใหม่โดยมีข้อ จำกัด เพิ่มเติมซึ่งทำให้ Q เป็นเป้าหมายที่เคลื่อนไหวซึ่งอาจทำให้คำตอบที่ได้รับนั้นไม่ถูกต้อง นั่นคือมารยาทที่ไม่ดีเพียงแค่ถามคำถามใหม่ถ้าคุณมี
Anthon

คำตอบ:


22

ใช้ประโยชน์จากการขยายรั้ง:

du -b maybehere*/{*,.[^.],.??*}

หรืออีกวิธีหนึ่ง

du -b maybehere*/{,.[^.],..?}*

ตรรกะเบื้องหลังนี้อาจไม่ชัดเจนดังนั้นนี่คือคำอธิบาย:

  • * จับคู่ไฟล์ที่ไม่ซ่อนทั้งหมด
  • .[^.]จับคู่ไฟล์ที่ชื่อขึ้นต้นด้วยจุดเดียวแล้วตามด้วยไม่ใช่จุด นั่นเป็นชื่อไฟล์อักขระเพียง 2 ตัวในรูปแบบแรก
  • .??* จับคู่ไฟล์ที่ซ่อนซึ่งมีความยาวอย่างน้อย 3 ตัวอักษร
  • ..?* เหมือนด้านบน แต่อักขระตัวที่สองต้องเป็นจุด

จุดทั้งหมดคือการแยกฮาร์ดลิงก์ไปยังไดเรกทอรีปัจจุบันและพาเรนต์ ( .และ..) แต่รวมไฟล์ปกติทั้งหมดด้วยวิธีที่แต่ละไฟล์จะถูกนับเพียงครั้งเดียว!

ตัวอย่างที่ง่ายที่สุดคือการเขียน

du -b maybehere*/{.,}*

หมายความว่ารายการมีจุด.และ "ไม่มี" (ไม่มีอะไรอยู่ระหว่าง,และปิด}) ดังนั้นไฟล์ที่ซ่อนทั้งหมด (ซึ่งเริ่มต้นจากจุด) และไฟล์ที่ไม่ถูกซ่อนทั้งหมด (ซึ่งเริ่มต้นจาก "ไม่มี") จะจับคู่ ปัญหาคือว่าสิ่งนี้จะจับคู่.และ..และนี่อาจไม่ใช่สิ่งที่คุณต้องการดังนั้นเราจึงต้องยกเว้นมันอย่างใด


คำสุดท้ายเกี่ยวกับการขยายรั้ง

การขยายรั้งเป็นกลไกที่คุณสามารถรวมไฟล์ / สตริง / อะไรก็ได้ใน commandline ด้วยการเขียนตัวละครน้อยลง ไวยากรณ์{word1,word2,...}คือมันเป็นรายการของเครื่องหมายจุลภาคแยกสตริงที่เริ่มต้นและจบลงด้วยการ{ คู่มือให้พื้นฐานมากและในเวลาเดียวกันตัวอย่างการใช้งานทั่วไป}bash

$ echo a{b,c,d}e
abe ace ade

สิ่งที่ใช้ของ{ }ฉันมีความคิด :( คุณสามารถให้ฉันทิศทางที่จะได้รับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
Vidhan

@vidhan ดูการแก้ไขและดูที่man bashบท "Brace Expansion"
jimmij

คุณจะช่วยให้ฉันอธิบายเพิ่มเติมสำหรับข้างบนเล็กน้อยและอธิบายอย่างชัดเจนมากขึ้นว่าทุกสิ่งทำงานอย่างไรฉันใหม่กับสิ่งเหล่านี้ @jimmij
vidhan

6
.??*ล้มเหลวในการจับคู่.a, .b... ล้มเหลวเพื่อให้ตรงกับ.[^.]* ..foo
Stéphane Chazelas

4
.fooตรงกับทั้งสองและ.[^.]* คุณต้องการ.??* {.[!.],..?,}*
Stéphane Chazelas

14

เนื่องจากคุณใช้ไวยากรณ์เฉพาะของ GNU ( -b):

du -abd1 maybehere*/

ด้วยวิธีนี้มันเป็นduรายการไฟล์ในmaybehere*ไดเรกทอรี (และไม่รวมไฟล์จุด) -d1จำกัด การรายงานการใช้งานดิสก์ให้ลดลงหนึ่งระดับ (รวมถึงที่ไม่ใช่ไดเรกทอรีด้วย-a)

มิฉะนั้นสำหรับ globs ที่จะรวมไฟล์ที่ซ่อนอยู่ (ยกเว้น.และ..) เปลือกแต่ละคนมีไวยากรณ์ของตัวเอง:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    แม้ว่ามันจะรวมถึง.และ..ในระบบที่รวมไว้ในผลลัพธ์readdir() ซึ่งทำให้ใช้งานได้ยาก


8

ตัวเลือกอื่นสามารถใช้ได้ที่นี่ :

du -sm .[!.]* *

ทำไมคุณต้องการข้ามชื่อไฟล์ที่ขึ้นต้นด้วย .. ?
Kusalananda

2
สันนิษฐานได้เพราะพวกเขาไม่ต้องการที่จะแสดงรายการทุกอย่างใน../และด้านล่าง
Shadur

สิ่งนี้ไม่นับไฟล์เช่น..myfile; เพิ่ม..?*สำหรับที่ แต่ +1 สำหรับการใช้ไวยากรณ์ glob ที่เหมาะสมสำหรับการจับคู่เชิงลบ
Pedro Gimeno

0

หากคุณต้องการเพียงแค่รายการไดเรกทอรีที่ซ่อนอยู่หรือดำเนินการในไดเรกทอรีที่ซ่อนอยู่แล้วตามที่ Costas กล่าวว่าคุณสามารถใช้

du -b maybehere*/.*

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

du -b maybehere*/.*/


คุณช่วยโปรดดูคำถามอีกครั้ง @SailorCire ฉันได้แก้ไขมันนิดหน่อย
vidhan

@ vidhan ดังนั้นคุณแค่ต้องการซ่อนอยู่ในไดเรกทอรีเดียว ถูกต้องไหม
SailorCire

ไม่ฉันต้องการจับคู่ทั้งไฟล์ที่ถูกซ่อนและไม่ถูกซ่อนอยู่ในไดเรกทอรีเดียวแทนที่จะใช้ทั้ง du maybehere*/.*และmaybehere*/*หนึ่งของที่ซ่อนอยู่และอื่นสำหรับการไม่ซ่อน
vidhan

@vidhan du -bเลือกทั้งที่ซ่อนและไม่ซ่อน
SailorCire

ไม่ :( โชคร้ายที่ @SailorCire
vidhan

0

ในขณะที่ไม่ใช่เปลือกโดยตรงคุณสามารถใช้การค้นหาด้วยความลึกที่ จำกัด เช่นนี้

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