參考**:
#!/usr/bin/python
# -*- coding:utf-8 -*-
"""time:2023年5月23日17:01:38
author:zmy
intention:根據某個集市直接獲取需要遷移的清單
"""import os
import time
sum_line = 0
if __name__ == '__main__':
#獲取該mart_cmo下所有的列表:排除"partitions|.trash|data_export.db|.sparkstaging|.staging"這幾個清單
fr2 = os.popen('hdfs dfs -du -s hdfs: |sort -n -k1 |egrep -v "partitions|.trash|data_export.db|.sparkstaging|.staging"')
#此時的整個表清單上是個字串
content = fr2.read()
content_list = content.split("\n")
#該目錄用與存放最終的目錄
final_result =
#第一輪處理
middle_result1 =
for line in content_list:
if line:
big_location = line.split()
#獲取當前行的目錄大小和位置資訊
content_size = int(big_location[0])
content_location = str(big_location[1])
#5t的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
else:
#第二輪處理
#注意:此時line的形式為 大小 + 位置
middle_result2 =
for line in middle_result1:
if line:
location = line.strip()
os.environ['location'] = str(location)
fr2 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
content_data = fr2.read()
#進行二次判斷
content2_list = content_data.split("\n")
for line in content2_list:
if line:
big_location = line.split()
#獲取當前行的目錄大小和位置資訊
content_size = int(big_location[0])
content_location = str(big_location[1])
# 5t的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
else:
#下面一行**包含大小和位置
#第三輪處理
#middle_result2當中存放的是目錄,注意:沒有對應的大小
middle_result3 =
for line in middle_result2:
if line:
location = line.strip()
os.environ['location'] = str(location)
fr3 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
content_data = fr3.read()
#進行三次判斷
content3_list = content_data.split("\n")
for line in content3_list:
if line:
big_location = line.split()
#獲取當前行的目錄大小和位置資訊
content_size = int(big_location[0])
content_location = str(big_location[1])
# 5t的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
else:
#下面一行**包含大小和位置
#第四輪處理
#呵呵,經過第四輪處理後不知道會不會消失
middle_result4 =
for line in middle_result3:
if line:
location = line.strip()
os.environ['location'] = str(location)
fr4 = os.popen('hdfs dfs -du -s $location |sort -n -k1')
content_data = fr4.read()
#進行四次判斷
content4_list = content_data.split("\n")
for line in content4_list:
if line:
big_location = line.split()
#獲取當前行的目錄大小和位置資訊
content_size = int(big_location[0])
content_location = str(big_location[1])
# 5t的大小 = 5497558138880
if content_size < 5497558138880:
sum_line += 1
else:
#下面一行**包含大小和位置
#4輪過後我們在檢查一次
print("sum=%d"%sum_line)
print("4輪過後仍沒有被細化的列表:")
for line in middle_result4:
print("\033[45;1m%s\033[0m" % line)
line = "successful!"
print("\033[45;1m%s\033[0m"%(line))
#將最終的結果輸出到指定的檔案list當中
print("正在將最終的結果刷到list中")
fr5 = open("./list",mode="w",encoding="utf-8")
for line in final_result:
if line:
fr5.write(line+"\n")
fr5.close()
# 從結果集list中過濾出不含有dt=資訊的文字,並賦值給list1
print("正在從結果集當中過濾出含有dt分割槽的字段!")
os.system('more list | grep -v "dt=" > list1')
time.sleep(5)
# 從結果集list中過濾出含有dt=資訊的文字,並賦值給list2
print("正在從結果集當中過濾出不含有dt分割槽的字段!")
os.system('more list | grep "dt=" > list2')
time.sleep(5)
#對於list1,呼叫指令碼list.sh進行處理,形成第乙個結果集distcp.list
print("根據list列表中的清單構造10k對應的清單列表")
os.system('sh ./list.sh')
time.sleep(30)
#對於list2,進行文字格式的處理,只過濾出路徑即可。
fr6 = os.popen('more list2 |awk -f "/dt=" \'\'')
content6 = fr6.read()
content_list6 = content6.split("\n")
# 定義乙個set列表,用來去重
set_list =
for line in content_list6:
if line and line not
in set_list:
print("你好,需要手動處理的清單為:\033[42;1m%d\033[0m個" % (len(set_list)))
print("將需要手動處理的清單儲存到了distcp_handle.list文字中")
fr7 = open("./distcp_handle.list", mode="w", encoding="utf-8")
for line in set_list:
if line:
fr7.write(line + "\n")
"""當前目錄下各個檔案的作用:
1.transfer_help.py 總指令碼
2.list 所有需要遷移的清單
3.list1 不含有日期的清單
4.list2 含有日期的清單
5.distcp.list list1通過list.sh處理的結果,是第一批需要拷貝的清單結果
6.distcp_handle.list 需要手動進一步處理的清單
7. 本指令碼執行方法:/usr/local/bin/python3.2 transfer_help.py
8.在cmo1或者cmo2客戶端執行hdfs dfs -rmr hdfs://ns14/user/mart_cmo/temp/*/.distcp.tmp.attempt* 可以刪除*/目錄下distcp的冬冬
"""
互芯編譯命令
export path usr bin crosscompiler bin cygdrive c csdtk cooltools cygdrive c program files xoreax incredibuild make ct user fae ct target greenstone t0...
python執行shell命令
在此比較一下兩種方法執行系統命令的方法,以方便於日後運用 1.os.system system command exit status execute the command a string in a subshell.僅僅在乙個子終端執行系統命令,而不能獲取命令執行後的返回資訊.os.syste...
python呼叫shell命令
在python程式中呼叫shell命令 此函式會啟動子程序,在子程序中執行command,並返回command命令執行完畢後的退出狀態,如果command有執行內容,會在標準輸出顯示。這實際上是使用c標準庫函式system 實現的。缺點 這個函式在執行command命令時需要重新開啟乙個終端,並且無...