這是我擁有的檔案夾結構。

find . -type d在root檔案夾中使用 find 命令給我以下結果
結果
./folder1
./folder1/folder2
./folder1/folder2/folder3
但是,我希望結果僅為./folder1/folder2/folder3. 即如果里面有一個型別的檔案,則只列印結果.txt。
有人可以幫助解決這種情況嗎?希望這是有道理的。
uj5u.com熱心網友回復:
find . -type f -name '*.txt' |
sed 's=/[^/]*\.txt$==' |
sort -u
查找所有.txt檔案,洗掉檔案名以sed僅獲取父目錄,然后sort -u洗掉重復項。
這不適用于包含新行的檔案名/路徑。
uj5u.com熱心網友回復:
您可以使用此find命令查找所有*.txt檔案,然后獲得唯一的父目錄名稱:
find . -type f -name '*.txt' -exec bash -c '
for f; do
f="${f#.}"
printf "%s\0" "$PWD${f%/*}"
done
' _ {} | awk -v RS='\0' '!seen[$0] '
- 我們使用
printf "%s\0"換行符、空格和通配符來處理目錄名稱。 - 使用 gnu-awk 只列印唯一的目錄名
uj5u.com熱心網友回復:
使用關聯陣列和行程替換。
#!/usr/bin/env bash
declare -A uniq_path
while IFS= read -rd '' files; do
path_name=${files%/*}
if ((!uniq_path["$path_name"] )); then
printf '%s\n' "$path_name"
fi
done < <(find . -type f -name '*.txt' -print0)
檢查值 uniq_path
declare -p uniq_path
uj5u.com熱心網友回復:
也許這個 POSIX 一個?
find root -type f -name '*.txt' -exec dirname {} \; | awk '!seen[$0] '
*\n在每個目錄路徑后添加一個尾隨
* 當路徑中
的目錄\n名稱中有一個時會中斷
或者這個 BSD/GNU 一個?
find root -type f -name '*.txt' -exec dirname {} \; -exec printf '\0' \; | sort -z -u
*\n\0在每個目錄路徑后添加一個尾隨
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347828.html
上一篇:使用bash-c逐行決議
