2014-09-04 25 views
-1
[[email protected] dir2]# ls 
d1 d2 d3 d4 d5 f1 f2 f3 f4 f5 
[[email protected] dir2]# rm -f * 
rm: cannot remove `d1': Is a directory 
rm: cannot remove `d2': Is a directory 
rm: cannot remove `d3': Is a directory 
rm: cannot remove `d4': Is a directory 
rm: cannot remove `d5': Is a directory 
[[email protected] dir2]# ls 
d1 d2 d3 d4 d5 
[[email protected] dir2]# rm -rf * 
[[email protected] dir2]# ls 
[[email protected] dir2]# 

我在寫一個工具來刪除存在的文件和目錄。我需要驗證用戶是否給出了參數"*",然後刪除所有文件和文件夾。但當作爲參數給出"*"時,會在目錄中顯示文件和文件夾的數量,如何驗證"*"而不給出雙引號。如何在運行可執行文件時不提供引號而提取「*」

./a.out *./a.out -f *./a.out -rf *。我不能給./a.out "*"。我需要輸入./a.out *並進行驗證。這個怎麼做?

+2

通配符擴展是由shell完成的,到程序運行時爲時已晚。相反,您可以執行自己的'*'擴展並查看它是否與命令行匹配(儘管這不是萬無一失的,因爲目錄內容可能會在此期間發生變化) – 2014-09-04 11:36:41

回答

0

你絕對不能這樣做。原因是它是你的shell,而不是你正在運行的進程的任何部分,它擴展了像*這樣的通配符。你有一些選擇,但:

  1. 讓你的程序採取通配符引號形式,如'*',它內部使用globfnmatch等,您可以檢測一個通配符已經被shell擴展擴大通過注意到多個輸入參數到達,或者如果單個輸入參數,它是一個現有的文件名(*不可能存在於真實的文件名中)。這帶來的好處是您永遠無法處理非常大的擴展; shell本身不能在命令行傳遞給你一定數量的字符,這在通配符中有時會受到限制。
  2. 使您的程序一次拒絕超過N個文件操作。這在某些情況下可能是有用的保障。
  3. 修補系統中的shell以將當前未展開的命令行存儲在環境變量中,然後從程序中讀取它。這只是爲了大膽!
相關問題