2024/10/15

Asynchronous Crawler In PHP, Node.js And Python

ไน…ไน…ๅฐฑ่ฆ่ค‡็ฟ’ไธ€ไธ‹็ˆฌ่Ÿฒๅฏซๆณ•,ไธ็„ถไธๅธธ็”จๅฐฑ็”Ÿ็–ไบ†,้‡ๅฐไธ‰็จฎ่ชž่จ€ๅฏซๅ€‹ async ็š„็‰ˆๆœฌๅง。

node.js

const axios = require('axios');  
const urls = [  
    'https://jsonplaceholder.typicode.com/todos/1',  
    'https://jsonplaceholder.typicode.com/todos/2',  
    'https://jsonplaceholder.typicode.com/todos/3',  
];  
  
(async () => {  
    try {  
        const requests = urls.map(url => axios.get(url));  
        const responses = await Promise.all(requests);  
  
        responses.forEach(response => {  
            console.log(response.data.id);  
        });  
    } catch (error) {  
        console.error(error.message);  
    }  
})();

Python

import aiohttp  
import asyncio  
  
urls = [  
    'https://jsonplaceholder.typicode.com/todos/1',  
    'https://jsonplaceholder.typicode.com/todos/2',  
    'https://jsonplaceholder.typicode.com/todos/3',  
]  
  
  
async def fetch_url(session, url):  
    async with session.get(url) as response:  
        return await response.json()  
  
  
async def main():  
    async with aiohttp.ClientSession() as session:  
        tasks = [fetch_url(session, url) for url in urls]  
        responses = await asyncio.gather(*tasks)  
  
        for responses in responses:  
            print(responses.get('id'))  
  
  
if __name__ == '__main__':  
    asyncio.run(main())

PHP

<?php

use GuzzleHttp\Client;
use GuzzleHttp\Promise\Utils;

include "vendor/autoload.php";

$urls = [
    'https://jsonplaceholder.typicode.com/todos/1',
    'https://jsonplaceholder.typicode.com/todos/2',
    'https://jsonplaceholder.typicode.com/todos/3',
];

$client = new Client([
    'verify' => false,
]);
$promises = [];

foreach ($urls as $url) {
    $promises[] = $client->getAsync($url);
}

$results = Utils::all($promises)->wait();

foreach ($results as $result) {
    echo json_decode($result->getBody()->getContents(), true)['id'], PHP_EOL;
}

2024/10/09

(G)I-DLE 2024 Concert In Taipei

ๆˆ‘่ ปๅธธ็œ‹ๆผ”ๅ”ฑๆœƒ็š„,ไฝ†้€™ๆ˜ฏๆˆ‘็ฌฌไธ€ๆฌก็œ‹้Ÿ“ๅœ˜็š„ๆผ”ๅ”ฑๆœƒ,ๅคชๅ–œๆญก (G)I-DLE ้€™ๅ€‹ๅœ˜้ซ”ไบ†,ๆญŒๅฅฝ่ฝ,ไบ”ๅ€‹ๅœ˜ๅ“กๅˆ่ทŸ็˜‹ๅญไธ€ๆจฃๅฅฝ็ฌ‘,ๅ…ถไธญๆˆ‘็š„ๆœฌๅ‘ฝๆ˜ฏ Minnie,่ฟทไบบ็š„้›™็œผ,ๆœ‰็ฃๆ€ง็š„่ฒ้Ÿณ,่ฆชๅˆ‡็š„ๅค–่กจ,ๅฎŒๅ…จ็„กๆณ•ๆ‹›ๆžถ。

ๆ‡‰่ฉฒๅพˆๅคšไบบ้ƒฝๆ˜ฏๅพž้€™้ƒจๅฝฑ็‰‡ๅ…ฅๅ‘็š„,Minnie ้žๅธธๆœ‰่ชž่จ€ๅคฉๅˆ†,ๅ…ถไป–ๅœ˜ๅ“ก้›–็„ถไนŸ็ฎ—ๅŠชๅŠ›ๅญธไธญๆ–‡,ไฝ† Minnie ่ฌ›่ตทไธญๆ–‡ๅนพไนŽๆฒ’ๆœ‰ๅฃ้Ÿณ,่€Œไธ”ๆœ‰ๆญฃ็ขบ็š„้‚่ผฏ็†่งฃ,้€™ๆฎต่ทŸๅฑฌๆ–ผไธญๅœ‹ไบบ็š„้›จ็ฆๅตๆžถๅฑ…็„ถ็”จ้‚่ผฏ่ผพๅฃ“ ๐Ÿ˜™

ๅฅน้‚ฃ็ฃๆ€งๅ่ถณ็š„ๅ—“้Ÿณๆˆ‘ๅ€‹ไบบ่ฆบๅพ—ๅฅน solo ๆ˜ฏๅฎŒๅ…จๆฒ’ๅ•้กŒ็š„,็œŸ็š„ๆ˜ฏๅคชๅฏๆ„›ไบ†,้›ฃ่ƒฝๅฏ่ฒด็š„ๆ˜ฏ,ๅฅนๅฎถๅœจๆณฐๅœ‹ๆ˜ฏๆœ‰้Œข็š„ๅฎถๆ—,(G)I-DLE Minnie็ซŸๆ˜ฏ้šฑ่—็‰ˆๆณฐๅœ‹ๅ…ฌไธป?,ๆœ‰ไธ€้›†้Ÿ“็ถœๆœ‰ๅŽปๆ‹ๅฅนๅฎถ,่ทŸ็š‡ๅฎฎๅทฎไธๅคš,ไฝ†ๆŽฅ่งธ้Žๅฅน็š„ไบบ้ƒฝ่ชชๅฅนๆฒ’ๆœ‰้ฉ•ๆฐฃ,ๆผ‚ไบฎๅˆๅฏๆ„›็š„ไปฃ่กจ。

ๅ…ฅๅฃ

่ฒป็›กไน็‰›ไบŒ่™Žไน‹ๅŠ›ๆถๅˆฐ็ฅจ,2024/10/06 ็ต‚ๆ–ผ่ฎ“ๆˆ‘ไธ€ๅ„Ÿๅค™้ก˜ๅฏไปฅ็œ‹ๅˆฐไป–ๅ€‘็พๅ ด่กจๆผ”。

Taco

็”ฑๆ–ผๆผ”ๅ”ฑๆœƒๆ˜ฏ 17:30 ้–‹ๅง‹,ๆ‰€ไปฅๅ…ˆๅƒ้ปžๆฑ่ฅฟๅขŠๅขŠ่‚šๅญ,ๅฐๅทจ่›‹่ฃก้ขๆ˜ฏไธๅฏไปฅๅƒๆฑ่ฅฟ็š„。

ๆผ”ๅ”ฑๆœƒๅ…ง้ƒจ

้€ฒๅˆฐๆผ”ๅ”ฑๆœƒ็พๅ ด่ถ…่ˆˆๅฅฎ็š„,ๆˆ‘ๅƒๅŠ ้Ž้‚ฃ้บผๅคšๆผ”ๅ”ฑๆœƒ,็ฌฌไธ€ๆฌก้‡ๅˆฐๅ…‰ๆ˜ฏ็œ‹ MV ๅฐฑๅ…จๅ ดๅคงๅˆๅ”ฑ็š„ๆƒ…ๆณ,็œŸ็š„่ถ…็ดš high。

ๆˆ‘้Œ„ไบ†ๅนพ้ฆ–ๆˆ‘็‰นๅˆฅๅ–œๆญก็š„ๆญŒ็š„็‰‡ๆฎต,ๅคง้ƒจๅˆ†็š„ๆ™‚้–“้ƒฝๆ˜ฏๅฐˆๅฟƒ็”จ้›™็œผ้›™่€ณไบซๅ—็พๅ ด่กจๆผ”,ไป–ๅ€‘็พๅ ดๅฏฆๅœจๆ˜ฏๅคช่ฟทไบบไบ†,็”ฑๆ–ผๅœ˜ๅ…งๆœ‰ๅ…ฉไฝๆœƒ่ฌ›ไธญๆ–‡็š„ไบบ,่ทŸ็พๅ ด็š„ไบบไบ’ๅ‹•็’ฐ็ฏ€ๆปฟ้ปž,Yuqi ่ทŸ่ˆ’่ฏๅˆๅพˆๆž็ฌ‘,่Šๅคฉ็’ฐ็ฏ€็ฌ‘ๆ–™ไธๆ–ท,ๆˆ‘ไธŠไธ€ๆฌก็œ‹็š„ๆผ”ๅ”ฑๆœƒๆ˜ฏ้„ญไธญๅŸบ,้„ญ็š„ๆƒ…ๆญŒๅฑ…ๅคš,ๆ‰€ไปฅๆ•ดๅ ดๅคง้ƒจๅˆ†้ƒฝๆ˜ฏๅฐˆๅฟƒ่ฝๆญŒ,ๅ†ท้œๆ„Ÿๅ‹•,ไฝ†้€™ๅ ดๆ˜ฏๅพž้ ญ high ๅˆฐๅฐพ,ๅ› ็‚บไป–ๅ€‘ๅฏไปฅๅธถๅ‹•ๆฐฃๆฐ›็š„ๆญŒๅคชๅคšไบ†,ๅคง้ƒจๅˆ†ๆ™‚้–“้ƒฝ่™•ๆ–ผ็ˆ†่ฃ‚็ˆฝ็š„ๆƒ…ๆณ,้žๅธธ้žๅธธ็š„ๅฅฝ็Žฉ。

้€™ๆ˜ฏๆˆ‘่ฝ้Ž้€™้บผๅคšๅ ดๆผ”ๅ”ฑๆœƒไปฅไพ†็ฌฌไธ€ๆฌกๆœ‰็ตๆŸๅพŒไธๆƒณ้›ข้–‹็š„ๆƒ…็ท’,ๅฐฑๅพˆๆจไธๅพ—,ๅๆˆ‘ๅฆนๆ—้‚Š็š„ๆญŒ่ฟท้‚„ๅ“ญไบ†,ๅคงๅฎถ้ƒฝๅพˆไพไพไธๆจๅง,ไธญ้–“ๆœ‰็ฉฟๆ’ๅนพๅ€‹ๆ›่ฃๅขŠๆช”็š„ๅฝฑ็‰‡,ๅ…ถไธญไธ€ๅ€‹ๅฝฑ็‰‡ๆ˜ฏ็”จ QA ๅ•ๆฏๅ€‹ๅœ˜ๅ“กไธ€ไบ›ไบ‹ๆƒ…,่ฎ“ๆˆ‘ๅฐ่ฑกๆทฑๅˆป็š„ๆ˜ฏ,็•ถๅ•ๅˆฐๅจŸ็ธฝ (G)I-DLE ็š„ๆผ”ๅ”ฑๆœƒไปฃ่กจไป€้บผๆ™‚,ๅจŸ็ธฝๅ›ž็ญ”:2024 ๆœ€้–‹ๅฟƒ็š„ไธ€ๅคฉ,ๆˆ‘็„กๆฏ”็š„่ดŠๅŒ,้‚ฃๅคฉๆˆ‘็œŸ็š„้žๅธธ้žๅธธ้žๅธธ็š„้–‹ๅฟƒ,ไธ‹ๆฌกไป–ๅ€‘ๅ†ไพ†้–‹ๆผ”ๅ”ฑๆœƒ็š„่ฉฑ,ๆˆ‘ไธ€ๅฎšๆœƒ่ฒทไธ‹้ข็š„ๅบงไฝ,ๆˆ‘ๆƒณ่ฆๅพ—ๅˆฐ่ทŸไป–ๅ€‘ไบ’ๅ‹•็š„ๆฉŸๆœƒ,็œŸ็š„ๅคชๅ–œๆญกไป–ๅ€‘ไบ†。

2024/07/11

Create Local SSL For Development

ๅ…ง้ƒจๆœๅ‹™ไฝฟ็”จ SSL ็›ธ้—œ่งฃๆณ•

๐ŸŸฃ ๅปบ็ซ‹่‡ช็ฐฝๆ†‘่ญ‰

  • domain name: example.test
  • ip: 10.10.10.22

๐ŸŽˆ ๆญคๆ–นๆณ•ไธ้œ€่ฆๆ“ๆœ‰็œŸๅฏฆ domain,ไฝ†ๆœƒ้œ€่ฆๅŽปๆฏๅ€‹ user ้›ป่…ฆ้…็ฝฎๅ…งๅฎน。

๐Ÿ’ฌ ๅปบ็ซ‹ ca ๆ†‘่ญ‰

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem

ๅปบ็ซ‹ๆต็จ‹ Common Name ๆœ€็‚บ้‡่ฆ,ไธๅฏไปฅๅกซ้Œฏ。

๐Ÿ’ฌ ๅปบ็ซ‹ service ๆ†‘่ญ‰้œ€ๆฑ‚ๆช”ๆกˆ

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

๐Ÿ’ฌ ็”ขๅ‡บ server ๆ†‘่ญ‰

ๅ…ˆๅปบ็ซ‹ไธ€ๅ€‹ๆ–‡ไปถ server.ext。

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.test
DNS.2 = *.example.test

๐Ÿ’ฌ ็”ข็”Ÿๆœๅ‹™ crt

openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile server.ext

๐Ÿ’ฌ ้…็ฝฎ nginx.conf

server {
    listen 443 ssl;
    root /var/www/html;
    server_name: example.test;
    index index.html;
    ssl_certificate /etc/ssl/server.crt;
    ssl_certificate_key /etc/ssl/server.key;
}

๐Ÿ’ฌ ๅฐ‡ CA ๆ†‘่ญ‰ๅŒฏๅ…ฅ Windows

Windows Key + r ๅซๅ‡บๅŸท่กŒ่ฆ–็ช—,่ผธๅ…ฅ certmgr.msc。

  1. ้ธๆ“‡ๅ—ไฟกไปป็š„ๆ นๆ†‘่ญ‰ๆŽˆๆฌŠๅ–ฎไฝ
  2. ๆŒ‰ไธ‹ๆป‘้ผ ๅณ้ต้ธๆ“‡ ๆ‰€ๆœ‰ๅทฅไฝœ > ๅŒฏๅ…ฅ
  3. ้ธๆ“‡ไธ‹ไธ€ๆญฅ。
  4. ๅฐ‡ๆช”ๆกˆ้กžๅž‹้ธๆ“‡ๆ‰€ๆœ‰ๆช”ๆกˆ,ไธฆไธ”้ธๆ“‡ ca.pem,ๆŽฅ่‘—ไธ€่ทฏไธ‹ไธ€ๆญฅไปฅๅŠๅŒๆ„ๅˆฐ็ตๆŸ。

๐Ÿ’ฌ ไฟฎๆ”น user hosts

Windows ็š„่ทฏๅพ‘ๅœจ C:\Windows\System32\drivers\etc\hosts

ๅกซๅ…ฅ 10.10.10.22 example.test。

้€™ๆ™‚ๅ€™ๅœจ็ถฒๅ€ๆ‰“ https://example.test ๆ‡‰ๅฏไปฅ้ †ๅˆฉไฝฟ็”จ https ้€ฃ็ทš server ไธฆไธ”ไธไบˆไปฅ่ญฆๅ‘Š。

๐ŸŸฃ ๅ…ถไป–ๆ–นๆณ•

๐Ÿ’ฌ ไฝฟ็”จ็œŸๅฏฆๆ†‘่ญ‰

ACME ้ฉ—่ญ‰ๆ–นๅผ

letsencrypt ๅฏไปฅไฝฟ็”จไธ็›ด้€ฃๆœๅ‹™้ฉ—่ญ‰็š„ๆ–นๅผ็™ผๆ”พๆ†‘่ญ‰,ๅฏๅƒ่€ƒๆ–‡ไปถ้€ฒ่กŒ DNS ่ช่ญ‰,ไฝ†้€™ๅ€‹ๆ–นๆณ•้‚„ๆ˜ฏๅฟ…้ ˆๆœ‰็œŸๅฏฆ domain name。

๐Ÿ’ฌ Reverse proxy server

ไฝฟ็”จไธ€ๅฐๅ…ทๆœ‰ domain public ๅฏ็”จ็š„ reverse server,ๅฐ‡ไป–้…็ฝฎๅฅฝ SSL ่ณ‡ๆบๅพŒๅฐ‡ domain ่ฝ‰ๅˆฐๅ€็ถฒ service,ไธฆไธ”้™ๅˆถๅฏ้€ฃ็ทš็š„ๅ€็ถฒ IP。

๐ŸŸฃ ๅƒ่€ƒ็ถฒ็ซ™

2024/05/22

Different copy behavior in rsync scp cp and mv

ๅœจ Linux ็š„็’ฐๅขƒๅ…ง,ๆˆ‘ๅ€‘ๅธธๅธธๆœƒ้œ€่ฆๆฌ็งป็›ฎ้Œ„ๆˆ–ๆช”ๆกˆ,ไธ็ฎกๆ˜ฏๅœจๅ…ง้ƒจๆˆ–่€…ๆ˜ฏ remote,ๆฌ็งป็š„ๆ™‚ๅ€™ๅฐพๅทดๆœ‰ๆฒ’ๆœ‰ / ้€™ๅ€‹็ฌฆ่™Ÿๅœจๅนพๅ€‹ๅธธ็”จ่ทŸๆฌ็งปๆœ‰้—œ็š„ๆŒ‡ไปคๅฏฆ้š›่กŒ็‚บๆœ‰ๅพˆๅคง็š„ๅทฎ็•ฐ,ไปฅไธ‹้ข็š„็ตๆง‹่ˆ‰ไพ‹。

src/first.txt
src/second/second.txt

dest/

src ๆ˜ฏไพ†ๆบ็›ฎ้Œ„,dest ๆ˜ฏ็›ฎๆจ™็›ฎ้Œ„。

cp

command result
cp -rv src dest/ dest/src/first.txt
dest/src/second/second.txt
cp -rv src/ dest/ dest/src/first.txt
dest/src/second/second.txt
cp -rv src/* dest/ dest/first.txt
dest/second/second.txt

cp ้€™ๅ€‹ๆŒ‡ไปคไธๆœƒ้šจ / ๆœ‰ๆ‰€ๅฝฑ้Ÿฟ,่ฆไธ่ฆ src ้€™ๅฑคๅ–ๆฑบๆ–ผไฝ ๆœ‰ๆฒ’ๆœ‰ๆŒ‡ๅฎšไป–ไปฅไธ‹็š„ๅ…งๅฎน้€ฒ่กŒ่ค‡่ฃฝ。

scp

command result
scp -r src dest/ dest/src/first.txt
dest/src/second/second.txt
scp -r src/ dest/ dest/src/first.txt
dest/src/second/second.txt
scp -r src/* dest/ dest/first.txt
dest/second/second.txt

scp ็š„่ค‡่ฃฝ่กŒ็‚บ่ทŸ cp ๆ˜ฏไธ€ๆจกไธ€ๆจฃ็š„。

rsync

command result
rsync -rv src dest/ dest/src/first.txt
dest/src/second/second.txt
rsync -rv src/ dest/ dest/first.txt
dest/second/second.txt
rsync -rv src/* dest/ dest/first.txt
dest/second/second.txt

rsync ๆ˜ฏๆœƒๅ—ๅˆฐ src ๅพŒๆ–นๆœ‰ๆฒ’ๆœ‰ / ๅฝฑ้Ÿฟ็ตๆžœ็š„。

mv

command result
mv src dest/ dest/src/first.txt
dest/src/second/second.txt
mv src/ dest/ dest/src/first.txt
dest/src/second/second.txt
mv src/* dest/ dest/first.txt
dest/second/second.txt

็ธฝ็ตไพ†่ฌ›,cp、scp、mv ้€™ไธ‰ๅ€‹ๆฌ้‹็š„่กŒ็‚บๆ˜ฏไธ€่‡ด็š„,ๆœƒๆœ‰ไธๅŒๅฝฑ้Ÿฟ็š„ๅชๆœ‰ rsync,ๆ‰€ไปฅไฝฟ็”จ rsync ๆ™‚่ฆๆฏ”่ผƒๆณจๆ„ไธ€้ปž,ไนŸๅฏไปฅ่ชชไฝ ่ฆไธๅŒ…ๅซ็›ฎ้Œ„็š„่ฉฑ,ๅ››ๅ€‹ๆŒ‡ไปคๅฐฑ้ƒฝๅŠ  /*,่ฆๅŒ…ๅซ็š„่ฉฑๅฐฑๅฐพๅทดไธ่ฆ /,้€™ๆจฃๆฏ”่ผƒๅฅฝ่จ˜。

2024/04/10

Windows PowerShell Theme

็„กๆ„้–“็œ‹ๅˆฐไบ†้€™ๅ€‹ๅฝฑ็‰‡How to set up PowerShell prompt with Oh My Posh on Windows 11,ๆฒ’ๆƒณๅˆฐ PowerShell ไนŸๅฏไปฅๆžๅพ—้€™้บผๆผ‚ไบฎ,ๆ–ผๆ˜ฏๅƒ็…ง่ฃก้ข็š„่จญๅฎš,ๅนซ่‡ชๅทฑ็š„ PowerShell ๅšไบ†ๅ–œๆญก็š„็•ซ้ขๆ”นๅ‹•。

  1. ๅฎ‰่ฃ Scoop
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
  1. ๅฎ‰่ฃ Nerd Fonts
scoop bucket add nerd-fonts
scoop install Hack-NF


ๅฎ‰่ฃ Nerd Fonts ๅพŒ,่จญๅฎš PowerShell ็š„ๅญ—้ซ”็‚บ Hack Nerd Font,ๅญ—ๅž‹ๅคงๅฐ 11,้€ๆ˜Žๅบฆ 85%。

  1. ๅฎ‰่ฃ Terminal Icons
scoop bucket add extras
scoop install terminal-icons
  1. ๅฎ‰่ฃ Oh My Posh
scoop install https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/oh-my-posh.json
  1. ๅฎ‰่ฃ fzf
scoop install fzf
Install-Module -Name PSFzf
  1. ๅฎ‰่ฃ zoxide
scoop install zoxide
  1. ้…็ฝฎๅ€‹ไบบ็’ฐๅขƒ่ฎŠๆ•ธ
nvim $PROFILE.CurrentUserAllHosts

Config ๅ…งๅฎน

Import-Module -Name Terminal-Icons

oh-my-posh init pwsh --config '~/AppData/Local/Programs/oh-my-posh/themes/remk.omp.json' | Invoke-Expression

Set-Alias ll dir
Set-Alias ls ~/scoop/shims/ls.exe
Set-Alias find ~/scoop/shims/find.exe

Invoke-Expression (& { (zoxide init powershell | Out-String) })

Set-PSReadLineKeyHandler -Key Ctrl+k -Function KillLine

# replace 'Ctrl+t' and 'Ctrl+r' with your preferred bindings:
Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'

# ๅผทๅˆถๆŒ‡ๅฎšๆจ™ๆบ–่ผธๅ…ฅ่ˆ‡่ผธๅ‡บ็š„็ทจ็ขผ
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# ๅŒๆญฅๅŸท่กŒ chcp ็ขบไฟๅบ•ๅฑคๅญ—็ขผ้ ๅˆ‡ๆ›
chcp 65001 | Out-Null

ๆˆ‘้ธๆ“‡ไบ† remk ้€™ๅ€‹ theme,ๅฎ‰่ฃไบ†ๅฅ—ไปถ busybox ่ฎ“ไป–ๆ›ดๅƒ Linux,ไนŸๅŒๆ™‚ๅฎ‰่ฃไบ† versions。

Final Theme
ๆ–ผๆ˜ฏๆˆ‘ๅฐฑๅพ—ๅˆฐไบ†็พŽ็พŽ็š„ terminal。

reference

2024/03/25

Delete None Keeping Files Part II

ไน‹ๅ‰ๅฏซ้Ž้€™็ฏ‡ Delete None Keeping Files,ๅœจๆŸๅ€‹็›ฎ้Œ„ไพ็…งๅปบๆ—ฅไฟ็•™ๆœ€ๆ–ฐ็š„ N ๅ€‹ๆช”ๆกˆ,ๆœ‰ๅ€‹ๆ–ฐๆ”น่‰ฏ็š„ๅฏซๆณ•ๆˆ–่จฑๆ›ดๅฅฝๆ‡‚。

#!/bin/bash

KEEP=10
DIRECTORY=/data/

find "$DIRECTORY" -maxdepth 1 -type f -name "*.log" -printf "%T@ %p\n" | sort -r | tail -n +$(($KEEP+1)) | awk '{print $NF}' | xargs rm -f

ไพ†่งฃ้‡‹ๅ„ๆฎตๅƒๆ•ธ:

  • find "$DIRECTORY":ๅฐ‹ๆ‰พ็›ฎๆจ™็›ฎ้Œ„
  • -maxdepth 1:ๅชๆ‰พ่ฉฒ็›ฎ้Œ„็ฌฌไธ€ๅฑค
  • -type f:ๅชๆ‰พๅฐ‹ๆช”ๆกˆ,ไธๅˆ—ๅ…ฅ็›ฎ้Œ„
  • -name '*.log':ๆ‰พๅฐ‹ๅ‰ฏๆช”ๅ็‚บ log ็š„ๆช”ๆกˆ
  • -printf "%T@ %p\n":ไฝฟ็”จ printf ่ผธๅ‡บ,่ผธๅ‡บๆ–นๅผ็‚บๅปบ็ซ‹็š„ๆ™‚้–“ๆˆณ + ๆช”ๅ
  • sort -r:ไพ็…งๆ™‚้–“ๆˆณ้€†ๆŽ’ๅบ
  • tail -n +$(($KEEP+1)):ๅˆ—ๅ‡บไฝ ่ฆไฟ็•™็š„ๆช”ๆกˆๆ•ธไปฅๅค–็š„ๆช”ๆกˆ
  • awk '{print $NF}':ๅชๆŠ“ๅ‡บๆช”ๆกˆ่ทฏๅพ‘
  • xargs rm -f:ๅˆช้™ค่ฉฒๆช”ๆกˆ

้€™ๆจฃ็š„ๅฏซๆณ•ๆ‡‰่ฉฒๆ˜ฏ่ฌ็„กไธ€ๅคฑไบ†。