จะดึง“ ./” นำหน้าใน unix“ find” ได้อย่างไร?


144
find . -type f -print

พิมพ์ออกมา

./file1
./file2
./file3

วิธีใดก็ได้ในการพิมพ์

file1
file2
file3

เหรอ?


1
ถ้าคุณใช้-exec /path/to/myscript.sh {} ในของคุณfindที่-printf '%P\n'ไม่ได้ทำงาน แต่ฉันต้องทำ./คำนำหน้าในสคริปต์โดย:p=${1#"./"}
eigenfield

หากคุณทำเพียงไฟล์เดียว:f=`find . -name migration`; echo ${f/.\//}
masterxilo

คำตอบ:


40

หากอยู่ในไดเรกทอรีปัจจุบันเท่านั้น

find * -type f -print

นั่นคือสิ่งที่คุณต้องการ?


22
สิ่งนี้จะพลาดไฟล์ที่มีชื่อที่ขึ้นต้นด้วยจุด
Sean

2
ไม่ดีขึ้นอยู่กับการตั้งค่าเชลล์ * อาจไม่สามารถประเมินเป็นไฟล์ / ไดเร็กทอรี "ซ่อน" - ไฟล์ / ไดเร็กทอรีที่ขึ้นต้นด้วยจุด (.) ลองเรียกใช้คำสั่งนี้ใน dir ที่บ้านของคุณจากนั้นเพียงแค่ "find -type f" และดูความแตกต่าง .
Ilia K.

36
ข้อกังวลที่เกี่ยวข้องมากกว่าคือ '*' ถูกประเมินโดยเชลล์ คุณมีสถานการณ์การแทรกโค้ดที่เป็นอันตรายอย่างมีประสิทธิภาพ การสร้างไฟล์ชื่อ '--exec rm' และอีกไฟล์ชื่อ 'zzzz;' จะเป็นเรื่องเล็กน้อย ลาก่อนไฟล์
CWF

6
สิ่งนี้ไม่ปลอดภัย หากชื่อไฟล์ขึ้นต้นด้วยขีดจะถือว่าเป็นตัวเลือกในการค้นหาและอาจล้มเหลวหรืออาจสร้างความเสียหายได้
Dale Anderson

4
เหตุใดจึง-printต้องมี มันให้ผลลัพธ์เดียวกันโดยไม่มีการตั้งค่าสถานะนั้น
user13107

249

ค้นหาเฉพาะไฟล์ปกติในไดเร็กทอรีปัจจุบันและพิมพ์โดยไม่มี./คำนำหน้า "":

find -type f -printf '%P\n'

จากการค้นหาคนคำอธิบาย-printfรูปแบบ:

% P ชื่อไฟล์ที่มีชื่อของอาร์กิวเมนต์บรรทัดคำสั่งซึ่งพบว่าถูกลบออก


19
+1 ทางออกที่ดีหากเวอร์ชันของคุณfindรองรับ-printf(ไม่ใช่ทั้งหมด)
Todd Owen

2
อย่างที่ทอดด์พูด แต่ที่แม่นยำกว่านั้นมันไม่ใช่ POSIX 7
Ciro Santilli 郝海东冠状病六四事件法轮功

8
รองรับหรือไม่ปลอดภัยกว่าคำตอบที่ยอมรับแน่นอน
Dale Anderson

10
คุณสามารถใช้\0แทน\nถ้าคุณต้องการxargs -0find -type f -printf '%P\0' | xargs -0 head
ไพพ์

1
@Quanlong มันใช้งานได้บน macOS ถ้าคุณbrew install findutils;)
blockloop

60

ใช้ sed

find . | sed "s|^\./||"

2
นี่คือทางออกที่ฉันต้องการ มันเข้ากันได้กับ POSIX (ทำงานได้ทุกที่แม้แต่ระบบฝังตัว) สั้นมากและไม่น่าจะส่งผลให้เกิดพฤติกรรมที่ไม่คาดคิด นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Jody Bruchon

7
วิธีนี้จะรวมกับfind -exec?
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \; หรือ find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

11

มันอาจจะสั้นลง

find * -type f

ดีกว่าที่2> /dev/nullจะละเว้นข้อผิดพลาดที่รายงานเมื่อรันคำสั่งในไดเร็กทอรีว่าง
neevek

4

เนื่องจาก-printfตัวเลือกไม่มีใน OSX findนี่คือคำสั่งเดียวที่ใช้งานได้บน OSX find ในกรณีที่มีคนไม่ต้องการติดตั้งgnu findโดยใช้brewetc:

find . -type f -execdir printf '%s\n' {} + 

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

2
คุณพูดถูก วิธีนี้ใช้ได้ดีกับไฟล์ในไดเร็กทอรีปัจจุบันเท่านั้น สำหรับไฟล์ที่ซ้อนกันเราจำเป็นต้องใช้:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava


1

อีกวิธีในการลอก. /

find * -type d -maxdepth 0

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