[英]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
在do
和done
,它一次查看一個文件,當前文件的名稱在參數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"' "{}" \;
筆記:
-E
選項告訴-regex
使用ERE。 如果您使用的是較舊的操作系統,則可能需要將ERE轉換為BRE。 ${..%..}
而不是${../../}
,使得這個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.