นี่เป็นวิธีที่ดีกว่าในการแก้ปัญหาด้วยการปัดเศษมากกว่าการค้นหา
$ cd ... # to the directory one level above the album/artist structure
$ echo */*/*.cover # lists all the covers
$ printf "%s\n" */*/*.cover # lists all the covers, one per line
ตอนนี้สมมติว่าคุณไม่มีไฟล์หลงทางในโครงสร้างที่ดีนี้ ไดเรกทอรีปัจจุบันประกอบด้วยไดเรกทอรีย่อยของศิลปินเท่านั้นและไดเรกทอรีเหล่านี้มีไดเรกทอรีย่อยของอัลบั้มเท่านั้น จากนั้นเราสามารถทำสิ่งนี้:
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
<(...)
ไวยากรณ์เปลี่ยนตัวกระบวนการทุบตี: จะช่วยให้คุณใช้คำสั่งในสถานที่ของการโต้แย้งไฟล์ มันช่วยให้คุณปฏิบัติต่อการส่งออกของคำสั่งเป็นไฟล์ ดังนั้นเราจึงสามารถเรียกใช้สองโปรแกรมและรับความแตกต่างได้โดยไม่ต้องบันทึกผลลัพธ์ในไฟล์ชั่วคราว diff
โปรแกรมคิดว่ามันจะทำงานร่วมกับสองไฟล์ แต่ในความเป็นจริงก็อ่านจากสองท่อ
คำสั่งที่ก่อให้เกิดการป้อนข้อมูลทางด้านขวามือไปdiff
, printf "%s\n" */*
เพียงแสดงรายการไดเรกทอรีอัลบั้ม คำสั่งทางซ้ายซ้ำผ่าน*.cover
เส้นทางและพิมพ์ชื่อไดเรกทอรีของพวกเขา
ทดสอบการทำงาน:
$ find . # let's see what we have here
.
./a
./a/b
./foo
./foo/bar
./foo/baz
./foo/baz/cover.jpg
$ diff <(for x in */*/cover.jpg; do echo "$(dirname "$x")" ; done) <(printf "%s\n" */*)
0a1,2
> a/b
> foo/bar
Aha ที่a/b
และไดเรกทอรีไม่มีfoo/bar
cover.jpg
มีบางกรณีที่มุมแตกเช่นนั้นโดยค่าเริ่มต้น*
จะขยายตัวเองหากไม่มีอะไรตรงกัน set -o nullglob
นี้สามารถอยู่กับทุบตีของ