2010-05-06 46 views
4

我正在尋找一種方法來找到我所知道的將是一個獨特的文件,然後切換到包含該文件的目錄。有沒有辦法找到一個特定的文件,然後一次轉換到包含它的目錄?

find . -name 'Subscription.java' | xargs cd 

或者:沿着線的東西

find . -name 'Subscription.java' -exec cd {} \; 

我知道這是行不通的,因爲它都試圖cd提供整個絕對路徑,其中包含的文件,也因爲xargs不能執行任何內置的shell命令,但是你明白了我想完成的事情。

回答

7
cd $(find . -name Subscription.java | xargs dirname) 
+0

正是我一直在尋找的命令。我知道它在那裏,但不知道該死的命令是什麼。真棒。謝謝。 – bergyman 2010-05-06 19:03:00

+1

對於任何其他不知道如何做到這一點的人,我只是將它拍成一個shell函數: 函數fcd() { cd $(find。-name $ 1 | xargs dirname) } – bergyman 2010-05-06 19:09:11

+2

'cd $ (dirname $(find。-name $ 1 | sed 1q))'處理非唯一名稱,找到第一個找到並返回,如果名稱未找到。它還演示了'$(...)'的嵌套使用,這就是爲什麼表示法比反引號更受歡迎的原因。你可能更喜歡''sed'2,$ d''',因爲它避免了與'find'相混淆的SIGPIPE錯誤。 – 2010-05-06 19:13:56

0

任何企圖腳本cd命令必須確保命令在當前shell中運行。否則,如果在子shell中運行,它不會像你需要的那樣工作,因爲父目前的工作目錄不會被改變。

GNU find有-printf可以用來打印任何找到的文件的目錄。查找的輸出可以通過命令替換傳遞給cd

cd $(find . -name Subscription.java -printf '%h\n') 

CD(在bash)忽略額外的參數,所以如果多個文件被發現,CD會變成第一個找到的文件的目錄。

0

的Linux/OSX(備選答案):

cd `find . -name Subscription.java | xargs dirname` 
相關問題