Bash

查找不適用於特定搜尋的操作

  • May 14, 2014

我正在嘗試使用該find命令列出特定文件集的大小,但沒有得到任何輸出。我使用的命令是:

find POD -type f -name *.mp3 -or -name *.ogg -ls

不產生任何輸出。儘管:

find POD -type f -name *.mp3 -or -name *.ogg

確實會產生輸出,我也嘗試過以下操作:

-printf "%p %k KB\n"
-exec ls -ls '{}' \;
-print0

但所有這些都沒有輸出。當我以不同的表達方式使用這些動作中的任何一個時,例如:

find . -maxdepth 1 -type f -printf "%p %k KB\n"

我也得到了預期的輸出。有誰知道問題是什麼?我在跑:

Linux irimi 3.10.37-1-MANJARO #1 SMP Mon Apr 14 20:56:29 UTC 2014 x86_64 GNU/Linux

又名最新的 Manjaro linux 發行版。我使用的外殼是:/bin/bashversion 4.3.8(1)-release

我的SHELLOPTS環境變數的內容是:

braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

我的BASHOPTS環境變數是:

cdspell:checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:hostcomplete:interactive_comments:nocaseglob:progcomp:promptvars:sourcepath

再次非常感謝嘗試調試此問題的任何幫助。

有一個帶有and/or關鍵字的陷阱findor應用於以下所有參數,包括操作(-ls在您的範例中)。沒有(或附加)的and表達式按閱讀順序評估,最後一站為假。沒有。or``and``implicit ()

所以命令的find POD -type f -name *.mp3 -or -name *.ogg -ls意思是,

  • 搜尋(從 POD 目錄開始)文件 — 如果沒有找到文件:停止
  • 否則(找到文件)檢查模式匹配*.mp3 —如果模式匹配:停止!(因為OR從這裡應用並且僅目前一個命令失敗時(但只有前一個命令,而不是前一組命令)

並且因為您在命令行中添加了一個執行語句 ( -ls, -exec, -print….),-print所以沒有隱式命令,因此如果 1) 1) 的所有條件都為真(文件和模式匹配),則無需執行任何操作。如果您刪除最後一個,則在每個條件分支的末尾-ls都有一個隱式分佈。-print

  • 否則,如果模式不匹配,則搜尋與模式匹配的任何內容(文件/目錄)*.ogg並列出它們(-ls不是條件命令,僅目前一個命令/測試“模式*.ogg為真時才執行)。但由於 1), 2) 僅針對非 mp3 文件進行評估。如果您沒有.ogg文件,則看不到任何內容。

解決方案1 在每個邏輯分支重複執行命令

  find POD -type f -name "*.mp3" -ls -or -name "*.ogg" -ls

解決方案 2添加(shell 保護)括號

  find POD -type f \( -name "*.mp3" -ls -or -name "*.ogg" \) -ls

請注意 ,您應該保護模式以避免在目前目錄中進行 shell 模式評估。

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