所以我有一個帶有嵌套資料夾的目錄,並且在某些時候還有.png
圖像。
這些圖像的命名是這樣的“letters_numbers_numbers_letters.png”,我想刪除數字之間的底線。
假設我們有一個名為 的文件a_1_2_b.png
,我想將其重命名為a_12_b.png
.我知道我必須使用類似的東西:
find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`
但我不確定如何指定如何刪除這個特定的底線。請記住,還有另外兩個底線我不想碰。
先致謝!
答案1
perl
使用s的變體之一rename
。例如,與那個(rename
類似 Debian 系統中的軟體包):
LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
s/(?<=\d)_(?=\d)//g' {} +
(高興時刪除-n
(空運行))。
有了zsh
,你可以這樣做:
autoload -Uz # best in ~/.zshrc
zmv -n '(**/)(*[0-9]_[0-9]*)(#qD.)' \
'$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'
它有點複雜,因為 zsh glob 中沒有 Perl 的環視正規表示式運算子的等效項。
這些刪除了_
每個常規檔案名稱中由數字包圍的所有 s(例如將dir_1_2_3/file_1_2_foo_22_3_4_bar
檔案重新命名為)。dir_1_2_3/file_12_foo_2234_bar
_
要僅刪除遵循該模式的常規文件中的第二個letters_digits_digits_letters.png
,只需:
zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
'$1$2$3'