2008-10-11 32 views
14

我是一個沉重的命令行用戶,並且在構建系統腳本中廣泛使用了find命令。然而在Mac OS X時,我不集中,我經常得到這樣的輸出:如何在OS X上將「查找」命令默認設置爲當前目錄?

$ find -name \*.plist 
find: illegal option -- n 
find: illegal option -- a 
find: illegal option -- m 
find: illegal option -- e 
find: *.plist: No such file or directory 

基本上,我忘了加上小點:

$ find . -name \*.plist 

因爲BSD find需要的路徑和GNU find不(如果你沒有指定一個,它會假定當前目錄)。我經常同時使用Linux,Mac OS X和Cygwin,因此讓我的所有工具表現相同對我來說是非常有益的。我試着寫了一個bash find函數,如果我忘記了,就會添加「./」,但我失敗了。謝謝你的幫助。 :)

回答

10

如果你不能約束自己使用find「正確」,那麼爲什麼不(從findutils)安裝GNU find在目錄上您的PATH未來的系統find命令。

我曾經有我自己的cp的私人變體,如果列表中的最後一項不是目錄,它會將文件複製到當前目錄。我將其保存在我個人的bin目錄中很多年 - 但最終將其刪除,因爲我不再使用該功能。 (我的'cp.sh'是1987年編寫的,在1990年和1997年兩次編輯,作爲版本控制系統符號變化的一部分。我認爲我在1998年左右將其刪除了。腳本的主要問題是cp file1 file2在將文件複製到另一個文件並將兩個文件複製到當前目錄。)

考慮編寫自己的包裝,以find

#!/bin/sh 
[ ! -d "$1" ] && set -- . "[email protected]" 
exec /usr/bin/find "[email protected]" 

第二行說:「如果參數1不是一個目錄,然後調整命令行參數包括提前命令的休息點。這將是混亂,如果你曾經鍵入:

~/bin/find /non-existent/directory -name '*.plist' -print 

,因爲不存在的目錄不是一個目錄和腳本將增加點到命令行 - 那種原因,我停止使用我的私人cp COM普通話。

4
find ./ -name "*.plist" 

編輯:嗯,我可能誤解了這個問題!如果你瘋了,怎麼樣通過shell腳本來模擬它?我經常在〜/ .bin中保存隨機的實用程序腳本,這是我PATH中的第一件事。如果你有一個類似的設置也許你可以這樣做:(!未經測試)

#!/bin/sh 
# remapping find! 
CMD=`echo $1 | cut -c 1` 
if [ $CMD = '-' ] 
then 
# pwd search 
    /usr/bin/find ./ $* 
else 
# regular find 
    /usr/bin/find $* 
fi 
+0

很好:)謝謝。雖然還不太完善,因爲它不處理: $找到 這理應得到轉換爲: $找到./ – mxcl 2008-10-11 23:56:43

1

這可能不是你想要什麼,而是怎麼樣:alias find="find ."

或選擇找到當地一個新的名稱(findl ?)

+0

我正要建議的別名,但後來意識到它不會,如果你工作順利*希望*在find命令行中指定路徑。 – 2008-10-11 22:18:47

+0

它會搜索本地目錄和您指定的路徑。 find不限於一個路徑參數。 – tzot 2008-10-11 22:44:16

+0

雖然如果我指定一個路徑,我可能不希望它搜索當前目錄。 – mxcl 2008-10-12 00:31:44

2

我會建議如果你正在編寫腳本(在將來某個時候更有可能從一個系統遷移到另一個系統),你應該嘗試使用更具體的命令形式,那就是指定「。」而不是依靠默認。出於同樣的原因,我甚至可能會建議編寫sh腳本,而不是依賴bash,這可能不會安裝到任何地方。

+0

這是一個很好的觀點。真的,如果我不指定路徑,我應該在其他平臺上添加一個腳本/函數來釋放find命令。這樣我就不會開始編寫腳本,這些腳本可能會因各種工具的不同實現而中斷。 – mxcl 2008-10-12 00:02:39

6

如果你一定要說是 '發現',然後你想:

alias find=/usr/bin/find\ . 
在.profile或.bash_profile文件或

...。在Mac OSX上替換真實路徑(如果不是/ usr/bin/find)。輸入完整的路徑以避免循環(通常bash會解釋爲alias find=find沒有問題,但更好確定)。

但是你最好不要命名別名find(findl,myfind等),因爲如果你在另一個系統上嘗試,它會成爲你的習慣和麻煩。

17

改爲安裝GNU find。

$ brew install findutils 
$ alias find=gfind 

是的,它的工作原理!

相關問題