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


18

และด้วยไฟล์ที่เก่าที่สุดที่ด้านล่าง?

นอกจากนี้หากฉันทำเช่นนี้เป็นไปได้ไหมที่จะตัดส่วนหัวที่ซ้ำซ้อนที่อยู่ในไฟล์ HTML แต่ละไฟล์ ฉันเห็นตัวเองเชื่อมไฟล์ HTML จำนวนมากเข้าด้วยกันและมันก็เป็นการดีที่จะลดขนาดไฟล์ของไฟล์ที่ดีที่สุดลงเล็กน้อย

คำตอบ:


33

ในการต่อไฟล์ที่คุณใช้

cat file1 file2 file3 ...

ในการรับรายการชื่อไฟล์ที่ยกมาเรียงลำดับตามเวลาใหม่สุดมาก่อนคุณใช้

ls -t

วางมันทั้งหมดเข้าด้วยกัน,

cat $(ls -t) > outputfile

คุณอาจต้องการให้ข้อโต้แย้งบางอย่างกับls(เช่น, *.html)

แต่ถ้าคุณมีชื่อไฟล์ที่มีช่องว่างอยู่มันจะไม่ทำงาน My file.htmlจะได้รับการสันนิษฐานว่าจะเป็นสองชื่อไฟล์: และMy file.htmlคุณสามารถทำให้การlsพูดชื่อไฟล์และจากนั้นใช้ที่เข้าใจอ้างเพื่อส่งผ่านอาร์กิวเมนต์ไปxargscat

ls -tQ | xargs cat

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


สิ่งนี้ใช้ไม่ได้กับระบบเดเบียนของฉัน ... ฉันต้องใช้cat $(ls -t) > outputfileมิฉะนั้นก็catปฏิเสธชื่อไฟล์ที่ยกมา
Mike Pennington

1
ความผิดพลาดของฉัน. ฉันมักจะถูกจับในสิ่งเหล่านี้ ดูคำตอบที่อัปเดต
angus

โอ้ - โดยส่วนหัวที่ซ้ำซ้อนฉันหมายถึงสิ่งต่าง ๆ ที่โดยปกติจะใส่ไว้ในไฟล์ header.php / footer.php บางส่วน แต่จะถูกบันทึกแยกต่างหากเมื่อบันทึกเป็น HTML (และสามารถเพิ่มขนาดไฟล์ได้จริงเมื่อคุณดาวน์โหลดหน้า PHP ขนาดใหญ่)
InquilineKea

cat $(ls -t)ยังมีความเสี่ยงที่จะขยายชื่อไฟล์ หากมีชื่อไฟล์ที่มี*หรือ?หรือหรือการแสดงออกวงเล็บ (เช่นfile-[old].html); และถ้าชื่อไฟล์ตีความว่าเป็นรูปแบบที่ตรงกับชื่อไฟล์อื่น ๆ ; วิธีการจะสร้างรายการที่ไม่ถูกต้อง set -fจะแก้ไขข้อบกพร่องนี้
Barefoot IO

ls -Qxargsอาจจะผลิตออกซึ่งไม่เหมาะสำหรับ ตัวอย่างเช่น"foo"กลายเป็น"\"foo\""แต่ xargs ไม่เข้าใจคำพูดคู่ที่หลบหนีภายในสตริงที่มีเครื่องหมายคำพูดคู่
Barefoot IO

2

วิธีที่ง่ายที่สุดของรายชื่อไฟล์ในการสั่งซื้อสินค้าอื่น ๆ กว่า lexicographic อยู่กับ zsh บ่น glob โดยไม่ต้อง zsh คุณสามารถใช้lsแต่แยกการส่งออกของlsจะเต็มไปด้วยอันตราย

cat *(om)

หากคุณต้องการตัดบางบรรทัดใช้ sed หรือ awk หรือ perl ตัวอย่างเช่นหากต้องการนำไฟล์<head>จากไฟล์แรกและรวม<body>ส่วนต่างๆจากไฟล์อื่นเข้าด้วยกันสมมติว่า<body>และ</body>แท็กอยู่คนเดียวในบรรทัดในทุกไฟล์:

{
  sed -e '/<\/body>/ q' *.html(om[2])
  sed -e '1,/<body>/ d' -e '/<\/body>/,$ d' *.html(om[3,-1])
  echo '</body>'
  echo '</html>'
} >concatenated.html

คำอธิบาย:

  • อย่างแรกconcatenated.htmlคือการสร้าง ดังนั้นจึงเป็น*.htmlไฟล์ที่อายุน้อยที่สุด(สมมติว่าไม่มีไฟล์ที่มีวันที่ในอนาคต
  • จากนั้นคัดลอกจาก*.htmlไฟล์ที่อายุน้อยที่สุดที่สองแต่ออกจาก</body>บรรทัด
  • จากนั้นคัดลอกจากไฟล์อื่น แต่ข้ามทุกอย่างลงไปที่<body>บรรทัดและเริ่มต้นด้วย</body>บรรทัด
  • ในที่สุดก็ผลิตแท็กปิดสุดท้าย

1

โซลูชันที่ @angus ให้นั้นดี แต่จะมีปัญหาหากมีไดเรกทอรีในโฟลเดอร์ซึ่งจะแก้ไขได้

cat $(ls -tpa | grep -v / )


Caveat: คำตอบนี้ยังเสี่ยงต่อการขยายชื่อพา ธ ตามที่อธิบายไว้ในความคิดเห็นของฉันกับคำตอบของแองกัส
Barefoot IO

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