ค้นหาชุดของไฟล์ทั่วไประหว่างหลายไดเรกทอรี?


9

ฉันกำลังมองหาเพื่อเปรียบเทียบไดเรกทอรีของชุดรูปแบบ Drupal ชุดรูปแบบ drupal เป็นไดเรกทอรีที่ประกอบด้วยไฟล์หลายไฟล์และฉันพยายามที่จะหาว่าไฟล์ใดที่จำเป็น ตัวอย่างเช่นพวกเขาทั้งหมดอาจมีไฟล์ที่เรียกว่าหรือtemplate.phppage.tpl.php

ฉันจะค้นหาชุดของไฟล์ทั่วไปทั้งหมดสำหรับหลายไดเรกทอรีได้อย่างไร ในกรณีของฉันไฟล์ 'เดียวกัน' ทั้งหมด (ชื่อเดียวกัน) จะอยู่ในไดเรกทอรีระดับเดียวกัน


มีคำตอบบางส่วนใน 'เชลล์ปริศนา' ของukuug.org/newsletter/10.4 (แม้ว่าพวกเขาจะเป็น shell-golf-ish)
James Youngman

คำตอบ:


7

แสดงรายชื่อทั้งหมด (ไม่ใช่พา ธ ) ของไฟล์ที่ใช้ร่วมกับไดเรกทอรีทั้งหมด

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

หรือเรียกมันว่าเป็นไฟล์สคริปต์หรือฟังก์ชั่นโดยมีไดเรกทอรีเป็นพารามิเตอร์

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"

1

คุณสามารถแสดงรายการชื่อเรียงตามจำนวนไดเรกทอรีที่ปรากฏใน

find */ |              # traverse all the template directories
sort -t / -k 2 |       # sort, ignoring the first field
tr '/' '\t' |          # turn / into tabs
uniq -f 1 -c |         # count duplicates, ignoring the first field
tr '\t' '/' |          # turn tabs back into /
sort -t / -s -k 1n     # sort by the number of occurrences

0

ด้วยMeldคุณสามารถเปรียบเทียบสองไดเรกทอรีและดูว่ามีไฟล์ใดบ้างในหนึ่งและไม่อยู่ในส่วนอื่นและในทางกลับกัน นอกจากนี้ยังสามารถแสดงความแตกต่างระหว่างไฟล์ทั่วไป


0

สำหรับ 3 ไดเรกทอรีหนึ่งในนั้นในปัจจุบันและสอง 'a' และ 'b' คุณสามารถโยงการทดสอบดังนี้:

ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null

หากไฟล์มีรูปแบบทั่วไป (เช่น. php) และไม่มีช่องว่างในชื่อไฟล์

การใช้lsในสคริปต์นั้นเป็นปัญหาเสมอและโดยปกติฉันไม่แนะนำให้ใช้ แต่ถ้าคุณมีภาพรวมเกี่ยวกับไฟล์ทั้งหมดในไดเรกทอรีที่การค้นหาเริ่มต้นและไม่มีช่องว่างหรือไม่มีอักขระพิเศษเช่น "*" หรือ "? "," <"หรือ" | "ควรบันทึกไว้เพื่อใช้งาน

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