簡體   English   中英

是否存在使用正則表達式更改文件名的grep或shell腳本?

[英]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" ] && mvif [ "$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.

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