Regular-Expression
獲取具有特定字元數的所有文件名
我想更改所有文件名,它們的確切長度為 16 個字元(數字和小寫字母)。我嘗試了以下程式碼段
[0-9a-z]{16}
中[0-9a-z]\{16\}
的佔位符regX
,但它不起作用。for file in <regX> do mv "$file" "${file}.txt" done
使用extglob
shopt -s extglob for file in +([0-9a-z]) do [[ ${#file} == 16 ]] && echo mv "$file" "${file}.txt" done
+([0-9a-z])
表示一個或多個[0-9a-z]
字元${#file}
給出文件名的長度echo
用於試執行,一旦情況好就刪除
Shell globbing 模式不是正則表達式。它們可能看起來很相似,但在某些方面它們的工作方式卻大不相同。
正則表達式
[0-9a-z]{16}
匹配包含上述字元範圍的 16 個字元的字元串(包含匹配的字元串可能更長)。等效的 shell globbing 模式類似於
*[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]*
這是因為
- 通配模式不支持“重複前 N 次”的修飾符。
- 萬用字元模式預設錨定到開頭和結尾。這就是我
*
在模式的開頭和結尾插入的原因。A*
匹配任意數量的任意字元。如果您想精確匹配16 個字元,請刪除這些。
[0-9a-z]
您可以使用 Perl創建一個 16 的字元串:$ pattern="$( perl -e 'print "[0-9a-z]" x 16' )"
使用
bash
,您可以選擇遍歷目前目錄中的所有名稱,然後測試名稱是否與您的正則表達式匹配:for name in *; do if [[ -f "$name" ]] && [[ "$name" =~ ^[0-9a-z]{16}$ ]]; then echo mv "$name" "$name.txt" fi done
echo
一旦你知道它在做正確的事情,就刪除它。請注意,我已經錨定了模式,這樣更長的名稱就不會匹配了。我還通過
-f
測試確保我們獲得的名稱實際上只是正常文件的名稱。