บรรทัดคำสั่ง OSX ค้นหาชื่อไฟล์ที่ซ้ำกันที่มีนามสกุลต่างกัน


1

ฉันได้ผ่านทุกคำถามที่คล้ายกัน + ติดตั้งสาธารณูปโภคบรรทัดคำสั่งไม่กี่อย่างดัฟฟ์ แต่ไม่มีความสำเร็จ

ในไดเรกทอรีรูปภาพของฉันฉันมีภาพที่มีชื่อเหมือนกัน แต่มีนามสกุลต่างกัน (jpg & png) ฉันแค่ต้องการพิมพ์ชื่อไฟล์ของชื่อไฟล์ซ้ำด้วยส่วนขยายที่ต่างกัน (เช่น foo.jpg & foo.png) หรืออย่างน้อยหนึ่งชื่อไฟล์ (foo)

จนถึงตอนนี้ฉันลองใช้วิธีเหล่านี้

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq

find . -type f \( -name "*.jpg" -o -name "*.png" \)

ที่สุดของคำสั่งเหล่านี้จะส่งกลับผมทั้งไม่มีอะไรหรือไฟล์ทั้งหมดหรือไม่ซ้ำกันชื่อไฟล์ แต่ไม่คนที่ซ้ำกัน

คำตอบ:


4

ฉันอยากจะแนะนำการแก้ไขคำสั่งที่สองของคุณ:

find . -type f -name "*.jpg" | \
    while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done

ซึ่งจะค้นหา.jpgไฟล์ทั้งหมดและตรวจสอบว่ามี.pngไฟล์ที่เกี่ยวข้องอยู่หรือไม่และแสดงพา ธ แบบเต็มโดยไม่มีนามสกุล

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

[ทดสอบกับbashUbuntu 18.04.1]


ค้นหา: ตัวเลือกที่ผิดกฎหมาย - t
Naveed Abbas

@ToughGuy - ฉันไม่ได้ใช้-tตัวเลือกใด ๆแต่บน Linux find .นั้นมีความหมายหากไม่มีการระบุไดเรกทอรีและอาจไม่ได้อยู่ใน OSX ฉันได้เพิ่ม.และเสนอชื่อไฟล์echoในกรณีที่คุณมีชื่อไฟล์แปลก ๆ ซึ่งอาจปรากฏเป็นตัวเลือก
AFH

-typeโดยทั่วไปแล้ว OSX จะค้นหาเข้าใจได้ตามนี้
xenoid

ใช่findบน Mac ต้องการ.หรือเส้นทางใด ๆ POSIX ต้องการมัน ที่นี่สำหรับผู้ใช้ขั้นสูงฉันไม่แนะนำให้ละเว้น.เพราะการพกพา
Kamil Maciorowski

@ KamilMaciorowski - ขอบคุณ: มีบางสิ่งที่ฉันเพิ่งทำความคุ้นเคย หากไม่มี Mac ฉันไม่สามารถตรวจสอบทุกตัวเลือกของทุกคำสั่งได้ในกรณีที่ไม่รองรับ
AFH

1

ฉันยอมรับและชื่นชมคำตอบ ในขณะที่ฉันได้รับสคริปต์ไพ ธ อนที่ทำงานค่อนข้างใกล้เคียงกับสิ่งที่ฉันกำลังมองหา ฉันพยายามค้นหาแหล่งที่มา แต่ไม่พบในแท็บ 100 แท็บที่ฉันค้นหา

#!/usr/bin/env python
# Syntax: duplicates.py DIRECTORY
import os, sys
top = sys.argv[1]
d = {}

for root, dirs, files in os.walk(top, topdown=False):
  for name in files:
    fn = os.path.join(root, name)
    basename, extension = os.path.splitext(name)

    basename = basename.lower() # ignore case

    if basename in d:
        print(d[basename])
        print(fn)
    else:
        d[basename] = fn

บันทึกไฟล์นี้เป็นไฟล์ซ้ำและให้สิทธิ์แล้วดำเนินการในโฟลเดอร์

./duplicates.py Images

การจับคู่ชื่อและคำต่อท้ายอื่น ๆ นั้นมีประโยชน์ แต่ไม่รับประกันว่าไฟล์จะซ้ำกันจริง คุณจะต้องรวมการเปรียบเทียบขนาดไฟล์และถ้าตรงกับการเปรียบเทียบเนื้อหาไฟล์จริง
Hogstrom

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

0

คุณต้องใช้uniq -cเพื่อให้ได้จำนวนแล้วย้อนกลับเรียงลำดับที่ส่วนท้ายเพื่อแสดงรายการที่ซ้ำกันก่อน ในตอนท้ายawkจะใช้ในการกรองสำหรับบรรทัดที่ขึ้นต้นด้วย 2 หรือสูงกว่า

$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
   2 foo

นี่%.*แถบขยายเพื่อให้กลายเป็นfoo.x.yfoo.x

แทนที่จะเป็นแบบง่าย ๆfind . -type fซึ่งจะค้นหาไฟล์ทั้งหมดคุณสามารถกรอง*.jpgหรือ*.pngไฟล์เช่นในคำสั่งที่สองของคุณ


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