簡體   English   中英

Bash Regex重命名文件

[英]Bash Regex rename files

我有一堆文件只是一個unix時間。 問題是他們的文件名轉到millis,掃描目錄的程序希望它們在幾秒鍾內完成。 所以我需要重命名所有文件以刪除.txt擴展名之前的最后3位數字。 IE:

1461758015598.txt - > 1461758015.txt

我是regex和bash的新手,所以我不知道該怎么做。

這是一種方式:

for f in *.txt; do   
  mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done

dodone ,它一次查看一個文件,當前文件的名稱在參數f "$f"是該參數的值,不變。 "${f/[0-9][0-9][0-9].txt/.txt}"是應用了替換的參數的值:將just替換為“三位數后跟.txt.txt

正如@anubhava指出的那樣,如果你不止一次地運行它,它將保持文件名的數字,所以不要這樣做。 你可以通過收緊glob模式使其成為冪等的。 這有點笨拙:

for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt; do   
  mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done

因此,您可能希望使用外部工具使其更緊湊(假設目錄中的任何文件名中沒有空格或換行符):

for f in $(ls -1 | egrep '^[0-9]{13}\.txt$'); do 
  mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done

您可以使用while read循環將限制減少到“無換行符”:

ls -1 | egrep '^[0-9]{13}\.txt$' | while read f; do
  mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done

馬克的答案涵蓋了許多選擇。

但是如果你想要一些遞歸的東西,我會選擇像這樣的基於find的解決方案:

find -E . -regex '.*/[0-9]{13}\.txt' -exec \
  sh -c 'set -; mv -v "$0" "${0%???.txt}.txt"' "{}" \;

筆記:

  • 我正在使用FreeBSD,它有-E選項告訴-regex使用ERE。 如果您使用的是較舊的操作系統,則可能需要將ERE轉換為BRE。
  • ERE堅持13位數。 如果您不止一次運行轉換,這可以避免anubhava對增加減少的擔憂。
  • 對於參數擴展,我使用${..%..}而不是${../../} ,使得這個POSIX兼容而不是依賴於bash。 (它當然也適用於bash,它根本不需要。)
  • 您可能想知道為什么匹配只是刪除單個通配符而不是數字。 這很好 - 我更容易輸入,我們已經將文件名約束設置為要find的選項的一部分。

如果您更願意避免使用find但仍希望在bash中遞歸,則可以使用globstar選項:

shopt -s globstar extglob
for f in **/+([0-9]).txt; do
  [[ $f =~ ^[0-9]{13}\.txt$ ]] && mv -v "$f" "${f%...\.txt}.txt"
done

請注意, globstar依賴於bash版本4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM