Rename
為什麼重命名根本不起作用?
我需要重命名多個文件,一些教程表明該命令
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-linux
rename
就足夠了: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