Bash
查找不適用於特定搜尋的操作
我正在嘗試使用該
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/bash
version4.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關鍵字的陷阱
find
。or
應用於以下所有參數,包括操作(-ls
在您的範例中)。沒有(或附加)的and
表達式按閱讀順序評估,最後一站為假。沒有。or``and``implicit ()
所以命令的
find POD -type f -name *.mp3 -or -name *.ogg -ls
意思是,
- 搜尋(從 POD 目錄開始)文件 — 如果沒有找到文件:停止
- 否則(找到文件)檢查模式匹配
*.mp3
—如果模式匹配:停止!(因為OR
從這裡應用並且僅目前一個命令失敗時(但只有前一個命令,而不是前一組命令)並且因為您在命令行中添加了一個執行語句 (
-ls
,-exec
,-ls
都有一個隱式分佈。
- 否則,如果模式不匹配,則搜尋與模式匹配的任何內容(文件/目錄)
*.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 模式評估。