這個問題在這里已經有了答案: 使用 shell globbing 匹配所有嵌套目錄下的所有檔案 6 個答案 8 小時前關閉。
這篇文章在6 小時前被編輯并提交審核。
我的問題首先在這個關于 SO的問題中表達,但在 Unix 上的這個答案中解釋為“通配符”問題。
我想知道是否,如果有,我可以做出什么簡單的宣告grep,如果有的話,在 PWD 和遞回中搜索具有特定擴展名的檔案。lscp
grep -r --include=\*.php "find me" ./不從 PWD 回傳結果。所以,這個問題沒有提供答案。
這不僅與示例命令有關grep// ,還ls與cp任何使用通配符的命令有關。所以,我很好奇任何其他可能與提供一個好的答案相關的命令,這取決于這些命令的作用,即一個通配符。(閱讀最后的詳細說明,了解我的意思。)
例子
假設我有這些檔案:
./file1.js
./file2.php
./inc/file3.js
./inc/file4.php
./inc.php/file5.js
./inc.php/file6.php
...并假設所有內容都可以被復制cp或找到匹配grep,等等。
我想要一個只匹配所有以 .php 結尾的檔案的 globbing 運算式:
./file2.php
./inc/file4.php
./inc.php/file6.php
所需的解決方案:通過通配的單個命令
我將輸入什么作為 globbing 引數以僅回傳 .php 檔案,包括 PWD?
cp -r [globbing argument] ~/destination/
grep -R "find me" [globbing argument]
ls -l [globbing argument]
當前解決方案:錯誤的誤用邏輯
目前,我只有這個&&:
cp *.php ~/destination/ && cp -r */*.php ~/destination/
grep -R "find me" *.php && grep -R "find me" */*.php
ls -l *.php && ls -l */*.php
但是,它們使用連接在一條線上的兩個命令&&,因此遵循exit邏輯,這意味著如果第一個命令由于某種原因失敗,第二個命令可能永遠不會執行,即使它會找到結果。
有沒有辦法在單個 globbing 運算式中實作這些期望的結果?是否有一些字符類(AKA RegEx)運算式適用于以這種方式進行通配?
shopt -s globstar;... **/*.php
這改變了問題;它沒有解決它。它可以適用于... **/*,例如在這個問題中由“所有檔案”解決,但不適用于我的問題中指定的檔案擴展名,如 *.php。
在此設定之前,PWD 中的檔案不匹配。
設定后,子目錄中的某些檔案會匹配兩次!
在shopt -s globstar作為單個命令輸入之前...
ls **/*.php回傳:
inc/file4.php
inc.php/file5.js
inc.php/file6.php
請注意,file2.php 根本沒有出現,但我需要它。
shopt -s globstar作為單個命令輸入后...
ls **/*.php回傳:
file2.php
inc/file4.php
inc.php/file6.php
inc.php:
file5.js
file6.php
請注意,inc.php/file6.php 列出了兩次。
與 相同grep,假設所有檔案都包含find me,就會發生這種情況......
在shopt -s globstar作為單個命令輸入之前...
grep -R "find me" **/*.php回傳:
inc/file4.php: find me
inc.php/file6.php: find me
請注意,file2.php 根本不匹配,但我需要它。
shopt -s globstar作為單個命令輸入后...
grep -R "find me" **/*.php回傳:
file2.php: find me
inc/file4.php: find me
inc.php/file5.js: find me
inc.php/file6.php: find me
inc.php/file6.php: find me
請注意,inc.php/file6.php 匹配了兩次。在看到輸出解釋的邏輯之后ls,這是有道理的。
但是,它并沒有解決我的問題。之前和之后shopt -s globstar,匹配的結果檔案都不是我需要的。而且,我需要一個命令;這種方式使用兩個命令并且還改變 BASH 設定。這對于許多簡單的目的可能很有用。但是,分別考慮之前和之后的空內容和重復內容,這是一個特別糟糕的解決方案。如果我有一個迭代每個專案的腳本,這將迭代該專案兩次,這可能會在很多方面造成麻煩,而且肯定不適合Python 之禪。
細化
我什至不知道這是特定于命令的標志問題還是純粹的通配問題。畢竟,grep確實有--include標志,它處理與檔案 glob 運算式相同的搜索條件。
假設沒有這樣的通配符,也許許多 Linux 命令都內置了標志,這些標志旨在相應地解決這個問題,類似于-r,但意思是-r $PWD。對于不同的命令,這些標志可能不同。在這種情況下,我不需要所有命令的這些標志的串列,但是很高興知道 , 和 的這些標志grep或cp作為ls一個很好的示例的其他命令是否旨在解決這個特定問題。
uj5u.com熱心網友回復:
使用 bash,您可以先執行 ashopt -s globstar以啟用遞回匹配,然后該模式**/*.php將擴展到當前目錄樹中具有 .php 擴展名的所有檔案。
zsh 和 ksh93 也支持這種語法。其他將 glob 模式作為引數并對其進行自身擴展的命令(如您的grep --include)可能不會。
uj5u.com熱心網友回復:
建議不同的策略:
使用顯式命令在使用選項的選定檔案上find構建命令。bash-printf
檢查命令的正確性并運行。
1. 準備bash選定檔案的命令
find . -type f -name "*.php" -printf "cp %p ~/destination/ \n"
2.檢查輸出,正確的命令,正確的過濾器,測驗
cp ./file2.php ~/destination/
cp ./inc/file4.php ~/destination/
cp ./inc.php/file5.php ~/destination/
3. 執行準備好的find輸出
bash <<< $(find . -type f -name "*.php" -printf "cp %f ~/destination/ \n")
uj5u.com熱心網友回復:
POSIX 方法是使用find -exec:
cp <all .php files> ~/destination/將會:
find . -name '*.php' -exec sh -c 'cp "$@" ~/destination/' _ {}
grep "finde me" <all .php files>將會:
find . -name '*.php' -exec grep "finde me" {}
ls -l <all .php files>將會:
find . -name '*.php' -exec ls -l {}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474901.html
