Rename

為什麼重命名根本不起作用?

  • December 20, 2021

我需要重命名多個文件,一些教程表明該命令rename是最好的選擇,而不是僅mv用於每個文件。

但後來我有這些文件:

ReconhecimentoImagens2021-10-18--2020-2.mp4       ReconhecimentoImagens2021-11-01--2020-2.mp4   ReconhecimentoImagens2021-11-22--2020-2.mp4
ReconhecimentoImagens2021-10-25--2020-2.mp4       ReconhecimentoImagens2021-11-08--2020-2.mp4   ReconhecimentoImagens2021-11-24--2020-2.mp4
'ReconhecimentoImagens2021-11-01--2020-2(2).mp4'   ReconhecimentoImagens2021-11-17--2020-2.mp4   ReconhecimentoImagens2021-11-29--2020-2.mp4

只是為了測試我嘗試了這個命令:

rename 's/2021/ /' *.mp4

什麼都沒有發生,我得到程式碼 4,根據手冊頁的意思是“沒有重命名”。

我搜尋了多個教程,但似乎沒有人做任何與此不同的事情,所以我在這裡做錯了什麼?

有不同版本的重命名,而你的不是支持 PERL 正則表達式的版本。

對於大多數 Linux 發行版和其他 unixoid 系統,有一些包包含從 perl 建構的rename.pl或簡單的命令。rename

在您的案例中,“經典” util-linuxrename就足夠了:

rename "2021" " "  *.mp4

會做。

老實說,我的外殼做得很好,我不必記住所有這些好東西。我曾經學過sed一些 OK-ish,我學過一次我的 shell 的for語法,就是這樣:

for filename in *.mp4 ; do
 mv "${filename}" "$(echo "${filename}" | sed 's/regex/replacement/')"
done

至少對我來說很容易記住,並且應該在 bash 和 zsh 以及其他類似 bourne 的 shell 中工作。不是我必須學習的額外命令。

事實上,如果你想讓事情變得簡單,你可以最大限度地使用自己喜歡的 shell 的變數擴展:

#!/usr/bin/env zsh
if [[ "${#}" -lt 2 ]] ; then 
 echo "Usage: ${0} [-r] PATTERN REPLACEMENT [FILE...]"
 echo "Uses normal Zsh globbing for pattern, unless -r is specified:"
 echo "In that case, use the regexp-replace loadable ZSH function"
 exit 1
fi

if [[ "${1}" = "-r" ]]; then
 autoload regexp-replace
 REGEX=1
 shift 1
else
 set -o extendedglob
 REGEX=0
fi

PATTERN="${1}"
REPLACEMENT="${2}"
shift 2

if [[ "${REGEX}" -eq 0 ]]; then
 for filename in ${argv} ; do
   mv "${filename}" "${filename/${1}/${2}}" || echo "Problem renaming ${filename}" >&2
 done
else
 for filename in ${argv} ; do
   original_filename="${filename}
   regexp_replace filename "${PATTERN}" "${REPLACEMENT}"
   mv "${original_filename} "${filename}" || echo "Problem renaming ${original_filename}" >&2
 done
fi

引用自:https://unix.stackexchange.com/questions/683190