我有一個包含數字文件名(例如#.php,##。php或###。php)的文件列表,我想一次性複製/移動。僅列出目錄中的數字文件名
有誰知道ls
或grep
組合命令來完成這個目標嗎?
我有這麼多:
ls -al | grep "[0-9].php"
我有一個包含數字文件名(例如#.php,##。php或###。php)的文件列表,我想一次性複製/移動。僅列出目錄中的數字文件名
有誰知道ls
或grep
組合命令來完成這個目標嗎?
我有這麼多:
ls -al | grep "[0-9].php"
列出文件時,您可以使用正則表達式:
ls [0-9]*
這是在上述問題的一個簡單,簡約的做法,但我認爲一個更好的解決方案是
ls -al | grep -E '^[0-9]+\.php$'
爲UncleZeiv解釋below。
修改這樣的:
ls -al | grep -E '^[0-9]+\.php$'
-E
激活擴展正則表達式。
+
要求至少出現前一組的出現。
\.
轉義點否則它表示「任何字符」。
^
和$
匹配整個文件名而不僅僅是一個部分。
單引號以防止可變擴展(它會因爲$
而發生抱怨)。
不要使用'ls'在腳本中,它僅用於交互式使用。 – Philipp 2010-06-30 17:04:39
@Philipp:沒有人提到腳本。 – Troubadour 2010-06-30 17:33:08
@Troubadour:進入'grep'的管道使它成爲一個「腳本」。 – 2010-06-30 17:49:43
使用find:
$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
注意,-regex
參數做了搜索,不匹配,這就是爲什麼^有沒有將它錨定到開始。這也假定文件與運行命令時所在的目錄位於同一個目錄(。)中。
{}
mv
命令中的詭計被find
替換爲找到的文件名。
要麼使用find
(可能與-XXXdepth
選項組合):
find . -mindepth 1 -maxdepth 1 -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
或者使用內置的正則表達式的功能:
pattern='^[0-9]+\.php$'
for file in *.php
do
[[ $file =~ $pattern ]] && echo "$file"
done
不要使用ls
或grep
。
在bash中,你可以使用擴展模式匹配:
shopt -s extglob
ls -l +([0-9]).php
這將找到的文件,如:
123.php
9.php
但不
a.php
2b.php
c3.php
這當然取決於殼?例如'bash'不會將其視爲正則表達式。試試看,你會看到它匹配_any_文件,其名稱以數字開頭。 – Troubadour 2010-06-30 16:42:30
其實我正在運行bash,它工作完美。這太簡單了。感謝您的解決方案。我用cp [0-9] * – gurun8 2010-06-30 16:54:07
@ gurun8:你很幸運,你的名字中沒有任何非數字字符的文件。 – Troubadour 2010-06-30 16:58:34