2010-06-30 64 views
9

我有一個包含數字文件名(例如#.php,##。php或###。php)的文件列表,我想一次性複製/移動。僅列出目錄中的數字文件名

有誰知道lsgrep組合命令來完成這個目標嗎?

我有這麼多:

ls -al | grep "[0-9].php" 

回答

-4

列出文件時,您可以使用正則表達式:

ls [0-9]* 

這是在上述問題的一個簡單,簡約的做法,但我認爲一個更好的解決方案是

ls -al | grep -E '^[0-9]+\.php$' 

爲UncleZeiv解釋below

+2

這當然取決於殼?例如'bash'不會將其視爲正則表達式。試試看,你會看到它匹配_any_文件,其名稱以數字開頭。 – Troubadour 2010-06-30 16:42:30

+0

其實我正在運行bash,它工作完美。這太簡單了。感謝您的解決方案。我用cp [0-9] * – gurun8 2010-06-30 16:54:07

+0

@ gurun8:你很幸運,你的名字中沒有任何非數字字符的文件。 – Troubadour 2010-06-30 16:58:34

6

修改這樣的:

ls -al | grep -E '^[0-9]+\.php$' 

-E激活擴展正則表達式。

+要求至少出現前一組的出現。

\.轉義點否則它表示「任何字符」。

^$匹配整個文件名而不僅僅是一個部分。

單引號以防止可變擴展(它會因爲$而發生抱怨)。

+2

不要使用'ls'在腳本中,它僅用於交互式使用。 – Philipp 2010-06-30 17:04:39

+0

@Philipp:沒有人提到腳本。 – Troubadour 2010-06-30 17:33:08

+1

@Troubadour:進入'grep'的管道使它成爲一個「腳本」。 – 2010-06-30 17:49:43

4

使用find:

$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';' 

注意,-regex參數做了搜索,不匹配,這就是爲什麼^有沒有將它錨定到開始。這也假定文件與運行命令時所在的目錄位於同一個目錄(。)中。

{}mv命令中的詭計被find替換爲找到的文件名。

+1

+1使用查找 – zdav 2010-06-30 16:41:28

+2

但沒有+1這樣使用它。這將打破文件名與空格或換行符。而是使用'find。 -regex'^ [0-9] + \。php'-exec mv'{}'dest /';''或者'xargs -0'。 – Philipp 2010-06-30 17:04:10

+0

@菲利普:謝謝,這更強大。我印象中原始海報的文件名集不包含空格,但當然安全性更好。 – unwind 2010-06-30 17:37:28

2

要麼使用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 

不要使用lsgrep

7

在bash中,你可以使用擴展模式匹配:

shopt -s extglob 
ls -l +([0-9]).php 

這將找到的文件,如:

123.php 
9.php 

但不

a.php 
2b.php 
c3.php