引言
有個需要,需要把某個目錄下的目錄結構進行複製,不要檔案,當目錄結構很少的時候可以手工去建立,當目錄結構複雜,目錄層次很深,目錄很多的時候,這個時候要是還是手動去建立的話,實在不是一種好的方法,弄不好會死人的。寫一個python指令碼來處理吧。
首先瞭解
寫python指令碼前,先瞭解幾個東西
代碼如下:
#!/usr/bin/python
這個東西寫過指令碼的人都知道,用來標明該指令碼的執行器,類似的還有
代碼如下:
#!/bin/bash 通過bash來執行
#!/usr/local/php/bin/php 通過php執行器來執行
# -*- coding: utf-8 -*-
這個是設定指令碼的編碼格式,不然非英文可能會出現亂碼
匿名函數lambda
代碼如下:
#lambda很好用,建立匿名函數很方便
g = lambda x,y : x+y
g(3,5) #返回8
匿名函數分為四部分,標識 lambda,分號 :,參數 x,y,操作 x+y
除了這個之外,還有函數map、filter一個進行映射,一個進行過濾
代碼如下:
__name__=="__main__"
一個檔案就是一個模組,在python中每個模組都有一個__name__屬性,屬性的值取決於如何使用該模組,一般有兩種使用方式,直接在命令列運行,這個時候__name__值為__main__,當import使用的時候,__name__值就是當前模組的名稱(不帶副檔名),因此可以通過這個判斷是否是直接在命令列運行程式,以便做一些指令碼使用。
代碼如下:
import os
import sys
還有這兩個模組,os包含一些作業系統功能,比如說遍曆檔案夾,拼接路徑等等,sys模組包含系統函數,我這裡只用來擷取指令碼後面的參數
編碼
代碼如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Filename:floders.py
import os
import sys
source = os.path.realpath(sys.argv[1])
target = os.path.realpath(sys.argv[2])
def isdir(x):
return os.path.isdir(x) and x != '.svn'
def mkfloders(src,tar):
paths = os.listdir(src)
paths = map(lambda name:os.path.join(src,name),paths)
paths = filter(isdir, paths)
if(len(paths)<=0):
return
for i in paths:
(filepath, filename)=os.path.split(i)
targetpath = os.path.join(tar,filename)
not os.path.isdir(targetpath) and os.mkdir(targetpath)
mkfloders(i,targetpath)
if __name__=="__main__":
if(os.path.isdir(source)):
if(target.find(source) == 0):
print("不能將產生的新目錄放在來源目錄下")
else:
if not os.path.isdir(target):
os.mkdir(target)
mkfloders(source,target)
else:
print("源檔案夾不存在")
使用
使用很簡單:
代碼如下:
#在當前檔案夾下執行
./folders.py ./ /tmp/yyyyy
#執行完之後就會在/tmp下建立yyyyy目錄,目錄中包含上面的第一個檔案夾中的目錄結構
這個地方有兩個要注意的地方,不能將建立後的目錄放在要複製的目錄中或者其子目錄中
總結
在做這個的時候遇到了這個問題 /usr/bin/python^M: bad interpreter: No such file or directory ,這個問題看樣子是編碼的問題,在每行後面添加了個字元,查資料後,原來是由於我從windows下直接把程式複製到linux下的編碼出現了問題,解決方案很簡單:vi folders.py之後,在命令列下輸入
代碼如下:
:set ff #結果表示編碼平台,應該是fileformat=dos
:set fileformat=unix #設定編碼到unix平台
:set ff #這個時候再去查看檔案編碼,應該是fileformat=unix