給定以下目錄結構:
$ tree --noreport dir
dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
| ├── .hiddenfileB
│ ├── fileC
│ └── fileD
└── dirA
├── .hiddenfileC
├── fileE
└── fileF
要求是呼叫 find ,以便從結果中排除隱藏目錄中的文件,但不包括隱藏文件(在非隱藏目錄下)。
預期回報應該類似於:
./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA
做了一些研究並發現這裡資訊使我創建了以下調用find
$ find . -type f -not -path '*/\.*' -print
但這個解決方案有一個缺點,就是跳過隱藏目錄和文件。
答案1
修剪隱藏目錄並將結果限制為檔案:
find . -type d -name '.?*' -prune -o -type f -print
正如建議的傑蒂爾,您可能更喜歡過濾掉目錄,這將導致顯示文件、連結等:
find . -type d -name '.?*' -prune -o ! -type d -print
答案2
您所擁有的命令非常接近工作。使用
find . -type f ! -path '*/.*/*' -print
- 路徑模式
*/.*/*
尋找 a/.
(表示以.
) 已關注(最終)經過a/
— 因此段名稱以.
不能是最後一個(檔名);即,它必須是目錄名稱。 -path
使用檔案名稱擴展模式;又稱通配符或通配符。所以你不需要放在\
前面.
。-not
如果您想要移植到非 GNU 系統,請不要使用。使用 來!
表示「否」是由 POSIX 指定的,並且適用於每個版本find
(甚至是 BSD、Solaris 等以及古老的系統)。