Shell
以任一順序回顯包含“a”和“b”的文件名
我有一個文件列表如下:
$ echo * add akfefg aka ab ba
我想以任一順序回顯包含“a”和“b”的文件名。我試過了
echo *[ab]*[ba]* aka ab ba
它還列印“aka”。我試過了
$ echo *a*b* && echo *b*a* ab ba
它完成了它的工作,但“ba”列印在下一行。有沒有更簡單的方法來做到這一點?謝謝你。
在這個答案中,我解決了兩種不同的情況:
- 您想匹配目前目錄中同時包含
a
和的文件名,然後您想對這些文件做一些事情。b
- 您想要處理兩個
echo
命令的輸出以刪除換行符。如果您想遍歷文件名,那麼最好有一個匹配所有名稱的單一模式,然後在循環中使用該模式的擴展。
echo
不建議使用,因為這消除了各個文件名之間的區別。在
zsh
shell 中,單一模式(*a*b*|*b*a*)
將擴展到字母a
和b
以任何順序出現的所有名稱。在
bash
shell 中,您可以使用單個擴展通配模式(或類似通ksh
配模式)@(*a*b*|*b*a*)
來做同樣的事情。預設情況下bash
,shell 不啟用擴展通配模式,因此您需要先啟用這些模式shopt -s extglob
。因此,在
bash
外殼中,您可以使用類似shopt -s extglob for name in @(*a*b*|*b*a*); do # process "$name" here done
生成所需文件名進行處理的另一種方法是使用
find
:find . ! -name . -prune -name '*a*' -name '*b*'
這會(僅)在目前目錄中查找包含
a
和的任何名稱b
。然後,您將-exec
在此命令末尾呼叫其他一些實用程序來執行操作,例如使用find . ! -name . -prune -name '*a*' -name '*b*' -exec sh -c ' for name do # process "$name" here done' sh {} +
在這裡,
find
生成內嵌sh -c
腳本使用的文件名。另請參閱了解find
的 -exec 選項但是,如果這是一個文本處理練習,並且目的是將兩行或多行文本(兩次
echo
呼叫的輸出)排列成一行,那麼您可以通過paste -s -
. 這將另外刪除嵌入文件名中的任何換行符。以paste
這種方式使用而不是tr -d '\n'
(也刪除換行符)確保生成的文本在末尾由單個換行符終止。