[英]Is there a grep or shell script that uses a regex to change filenames?
如何將xxx-xxx_[a-zA-Z]+_\\d+_(\\d+)\\.jpg
遞歸更改為$1.jpg
?
#!/bin/bash
find . | while read OLD; do
NEW="`sed -E 's/(.*\/)?xxx-xxx_[a-zA-Z]+_[0-9]+_([0-9]+)\.jpg/\1\2.jpg/' <<< "$OLD"`"
[ "$OLD" != "$NEW" ] && mv "$OLD" "$NEW"
done
一些注意事項:
將find
的輸出發送到while read
循環是一種一次讀取find
的輸出的巧妙方法。 很好,因為它會像find
那樣處理文件,而不`find`
建立整個文件列表,就像您在反引號中`find`
那樣。
如果您有大量不相關的文件,則可以添加-regex
選項,以根據soulmerge的答案進行find
,但是如果沒有,則不需要。
我修改了您的正則表達式,以允許目錄名稱位於最前面。 它們將被捕獲到\\1
,而您要查找的數字將是\\2
。
sed <<< "$OLD"
與echo "$OLD" | sed
echo "$OLD" | sed
,只是一點點幻想...
[ "$OLD" != "$NEW" ] && mv
與if [ "$OLD" != "$NEW" ]; then mv; fi
if [ "$OLD" != "$NEW" ]; then mv; fi
if [ "$OLD" != "$NEW" ]; then mv; fi
,只是一點點幻想...
編輯 :為兼容性將\\d
更改為[0-9]
。 我在Mac上對其進行了測試,並且可以正常工作。 這是我設置的測試目錄中發生的事情:
mv ./1/xxx-xxx_ERR_19_02.jpg ./1/02.jpg
mv ./2/xxx-xxx_BLAH_266_14.jpg ./2/14.jpg
mv ./xxx-xxx_ERR_19_01.jpg ./01.jpg
我給您提供了一個更詳細的版本,可以處理任何文件名(甚至是那些帶有空格污染名稱的文件夾中的文件名):
# file rename.sh
old="$1"
new="$(dirname "$1")/$(echo "$(basename "$1")"|sed 's/^xxx-xxx_[a-zA-Z]+_[0-9]+_//')"
mv "$old" "$new"
# execute this in the shell:
find . -regex "xxx-xxx_[a-zA-Z]+_[0-9]+_[0-9]+\.jpg$" -exec ./rename.sh "{}" ";"
如果您具有rename
(或prename
)命令(這是Perl隨附的Perl腳本):
find -type d -name dir -exec rename 's/xxx-xxx_[a-zA-Z]+_\d+_(\d+)\.jpg/$1.jpg/' {}/xxx-xxx_[a-zA-Z]*[0-9].jpg \;
在SuperUser.com上查看有關此問題的各種答案。 它正在處理相同的問題(使用正則表達式重命名文件)。 [ 並且花了我很長時間才能在StackOverflow上找到它-因為它不在SO上,而是在SU上! :(]
find /path -type f -name "???-???_[a-zA-Z]*_[0-9]*_*.???" | while read FILE
do
f=${FILE%%.???}
number=${f##*_}
extension=${FILE##*.}
path=${FILE%/*}
echo "mv '$FILE' '$path/$number.$extension"
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.