從查找結果中排除隱藏目錄中的文件,但不排除隱藏文件(在非隱藏目錄下)

從查找結果中排除隱藏目錄中的文件,但不排除隱藏文件(在非隱藏目錄下)

給定以下目錄結構:

$ 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 等以及古老的系統)。

相關內容