Shell-Script
awk 不能滿足我的要求
我的要求是 shell 腳本應該列印文件的文件夾名稱。
例如 comp.class 存在於 D:/Practice/HelloWorldPractice/bin 文件夾中,執行命令後我應該得到輸出bin。
我的命令搜尋文件並列印該文件的完整路徑。之後,它會從完整路徑中刪除文件名。最後,它會刪除除文件的文件夾名稱之外的所有內容。
程式碼
filesDirName="/D/Practice/HelloWorldSagar" file=comp.class echo $(find "${filesDirName}" -name ${file}) | awk -F '${file}' '{ print $1 }'| awk -F '${filesDirName}' '{ print $2 }'
輸出 空輸出
程式碼
當我在終端中輸入以下命令時,它工作正常….但是當我通過變數執行此操作時,我無法獲得輸出。
echo "$(find "/D/Practice/HelloWorldSagar" -name comp.class)" | awk -F 'comp.class' '{ print $1 }'| awk -F '/D/Practice/HelloWorldSagar' '{ print $2 }'
輸出
/斌/
使用
comp.class
作為欄位分隔符(或嘗試,變數擴展在程式碼中用單引號引起來)對awk
我來說意義不大,就像awk
在管道中相互執行多個程序一樣。據我了解,您想要包含該
comp.class
文件的目錄的文件名。這樣做:
topdir='/D/Practice/HelloWorldSagar' filename='comp.class' find "$topdir" -type f -name "$filename" \ -exec sh -c 'basename "$(dirname "$1")"' sh {} ';'
這將查找
comp.class
在 或以下呼叫的所有文件/D/Practice/HelloWorldSagar
。找到一個後,一個簡短的 shell 腳本會簡單地列印出找到的路徑名的目錄路徑的基本名稱(路徑名的文件名部分)。或者,查找目錄,然後單獨測試文件是否存在:
find "$topdir" -type d \ -exec test -f {}/"$filename" ';' \ -exec basename {} ';'
這會測試
comp.class
在所有找到的目錄下$topdir
(包括$topdir
它自己)是否存在。找到文件後,將列印找到的目錄的基本名稱。這兩種方法之間的區別在於,第二種方法還可以檢測一個稱為指向正常文件的符號連結。
comp.class
有關的:
以防萬一它不是您想要的目錄的基本名稱,而是下面的相對路徑
$topdir
:find "$topdir" -type f -name "$filename" \ -exec sh -c 'd="$(dirname "$2")"; printf "%s\n" "${d#$1/}"' sh "$topdir" {} ';'
這是第一個解決方案的變體,它將目錄名提取到一個變數
d
中,然後列印該目錄路徑名的值,並$topdir
從它的開頭刪除。