Shell-Script

awk 不能滿足我的要求

  • January 9, 2019

我的要求是 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從它的開頭刪除。

引用自:https://unix.stackexchange.com/questions/492803