Regular-Expression

獲取具有特定字元數的所有文件名

  • April 9, 2017

我想更改所有文件名,它們的確切長度為 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]*

這是因為

  1. 通配模式不支持“重複前 N 次”的修飾符。
  2. 萬用字元模式預設錨定到開頭和結尾。這就是我*在模式的開頭和結尾插入的原因。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測試確保我們獲得的名稱實際上只是正常文件的名稱。

引用自:https://unix.stackexchange.com/questions/357883