引言
在日常工作中,我們經常需要處理大量的檔操作,如重新命名、搜尋、同步等。透過編寫自動化指令碼,不僅可以提高效率,還能減少錯誤。本文將介紹幾個常用的檔操作指令碼,包括檔重新命名、搜尋、同步、壓縮、解壓以及日誌監控。
1. 檔重新命名指令碼
在處理大量檔時,手動重新命名不僅耗時還容易出錯。下面是一個使用 Python 編寫的檔批次重新命名指令碼。
import os
def rename_files
(directory, prefix="new_")
:
"""
批次重新命名指定目錄下的所有檔。
:param directory: 要處理的資料夾路徑
:param prefix: 新檔名字首,預設為 "new_"
"""
# 獲取指定目錄下所有檔名
files = os.listdir(directory)
for index, file in enumerate(files):
# 獲取副檔名
extension = os.path.splitext(file)[1]
# 構建新檔名
new_name =
f"{prefix}{index}{extension}"
# 拼接完整路徑
old_path = os.path.join(directory, file)
new_path = os.path.join(directory, new_name)
# 重新命名檔
os.rename(old_path, new_path)
print(
f"Renamed {file} to {new_name}"
)
# 使用範例
rename_files("/path/to/your/directory")
輸出範例:
Renamed old_file1.txt to new_0.txt
Renamed old_file2.jpg to new_1.jpg
...
程式碼解析:
os.listdir()
返回指定目錄下的所有檔和子目錄名。
os.path.splitext()
分離檔名與副檔名。
os.path.join()
拼接路徑。
os.rename()
用於重新命名檔。
2. 檔搜尋指令碼
在檔案系統中尋找特定檔是常見的需求。此指令碼可以在指定目錄及其子目錄中搜尋包含特定字串的檔。
import os
def search_files(directory, keyword):
"""
在指定目錄及其子目錄中搜尋包含特定字串的檔。
:param directory: 要搜尋的目錄
:param keyword: 關鍵詞
"""
for root, dirs, files in os.walk(directory):
for file in files:
if keyword in file:
print(os.path.join(root, file))
# 使用範例
search_files("/path/to/your/directory", "example")
輸出範例:
/path/to/your/directory/subdir/example.txt
/path/to/your/directory/subdir/another_example.docx
...
程式碼解析:
os.walk()
遍歷指定目錄樹中的檔名。
root
是當前目錄路徑。
dirs
是該目錄下的子目錄列表。
files
是該目錄下的檔列表。
3. 目錄同步指令碼
同步兩個目錄的內容,在備份或部署場景中非常有用。下面這個指令碼可以將源目錄中的所有檔復制到目標目錄中。
import shutil
import os
def sync_directories(src, dst):
"""
同步兩個目錄的內容。
:param src: 源目錄
:param dst: 目標目錄
"""
# 建立目標目錄(如果不存在)
if not os.path.exists(dst):
os.makedirs(dst)
# 復制檔
for item in os.listdir(src):
s = os.path.join(src, item)
d = os.path.join(dst, item)
if os.path.isdir(s):
sync_directories(s, d)
else:
shutil.copy2(s, d)
print(
f"Copied {s} to {d}"
)
# 使用範例
sync_directories("/path/to/source", "/path/to/destination")
輸出範例:
Copied /path/to/source/file1.txt to /path/to/destination/file1.txt
Copied /path/to/source/subdir/file2.txt to /path/to/destination/subdir/file2.txt
...
程式碼解析:
shutil.copy2()
復制檔並保留後設資料。
使用遞迴呼叫來處理子目錄。
4. 檔壓縮指令碼
在傳輸或儲存大檔時,壓縮檔可以顯著節省空間和時間。以下指令碼可以將指定目錄下的所有檔壓縮成一個
.zip
檔。
import zipfile
import os
def compress_directory(directory, output_zip):
"""
將指定目錄下的所有檔壓縮成一個 .zip 檔。
:param directory: 要壓縮的目錄
:param output_zip: 輸出的 .zip 檔路徑
"""
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, directory)
zipf.write(file_path, arcname=arcname)
print(
f"Added {file_path} to {output_zip}"
)
# 使用範例
compress_directory("/path/to/your/directory", "/path/to/output.zip")
輸出範例:
Added /path/to/your/directory/file1.txt to /path/to/output.zip
Added /path/to/your/directory/subdir/file2.txt to /path/to/output.zip
...
程式碼解析:
zipfile.ZipFile()
建立一個新的
.zip
檔物件。
write()
方法將檔添加到
.zip
檔中。
os.path.relpath()
計算相對路徑。
5. 檔解壓指令碼
與壓縮指令碼相對應,解壓指令碼可以將壓縮檔還原成原始檔結構。以下指令碼可以解壓指定的
.zip
檔到指定目錄。
import zipfile
import os
def extract_zip(zip_file, output_directory):
"""
解壓指定的 .zip 檔到指定目錄。
:param zip_file: 要解壓的 .zip 檔路徑
:param output_directory: 輸出目錄
"""
with zipfile.ZipFile(zip_file, 'r') as zipf:
zipf.extractall(output_directory)
print(
f"Extracted all files from {zip_file} to {output_directory}"
)
# 使用範例
extract_zip("/path/to/input.zip", "/path/to/output_directory")
輸出範例:
Extracted all files from /path/to/input.zip to /path/to/output_directory
程式碼解析:
extractall()
方法將
.zip
檔中的所有檔解壓到指定目錄。
os.path.join()
拼接路徑。
6. 日誌監控指令碼
對於伺服器管理和運維來說,即時監控日誌檔非常重要。以下指令碼可以即時監控指定的日誌檔,並在控制台打印新增的內容。
import time
def monitor_log_file(log_file):
"""
即時監控指定的日誌檔,並在控制台打印新增的內容。
:param log_file: 要監控的日誌檔路徑
"""
with open(log_file, 'r') as file:
file.seek(0, 2) # 移動到檔末尾
while True:
line = file.readline()
if not line:
time.sleep(1) # 沒有新行則等待
continue
print(line.strip())
# 使用範例
monitor_log_file("/path/to/logfile.log")
輸出範例:
閱讀:sfangba.com/184.html閱讀:sfangba.com/183.html閱讀:sfangba.com/182.html閱讀:sfangba.com/179.html閱讀:sfangba.com/178.html閱讀:sfangba.com/177.html閱讀:sfangba.com/176.html閱讀:sfangba.com/175.html閱讀:sfangba.com/174.html閱讀:sfangba.com/173.html閱讀:sfangba.com/172.html閱讀:sfangba.com/171.html
2023-10-01 12:00:00 - INFO - Some message
2023-10-01 12:00:01 - ERROR - An error occurred
...
程式碼解析:
file.seek(0, 2)
將檔指標移動到檔末尾。
readline()
讀取一行。
time.sleep(1)
暫停一秒以減少 CPU 占用。
總結
本文介紹了六個實用的檔操作指令碼,包括檔重新命名、檔搜尋、目錄同步、檔壓縮與解壓以及日誌監控。這些指令碼能夠幫助我們高效地處理檔案系統中的常見任務,提高工作效率。透過自動化這些任務,我們可以更加專註於核心業務邏輯。