複数のファイルの名前を変更する必要がありますが、一部のチュートリアルでは、各ファイル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が表示されます。
私はいくつかのチュートリアルを検索しましたが、誰も他のことをしないようです。それでは、ここで私が何を間違っているのでしょうか?
答え1
名前の変更にはさまざまなバージョンがあり、そのバージョンはPERL正規表現をサポートしていません。
rename.pl
ほとんどのLinuxディストリビューションやその他のUnixoidシステムには、Perlまたは単純なコマンドで構築されたパッケージがあります。rename
あなたのユースケースでは、「クラシック」util-linuxでrename
十分です。
rename "2021" " " *.mp4
します。
正直なところ、私のシェルは、これらすべての驚くべきことを覚えておく必要がないほど十分に機能しています。一度学んで、sed
ある程度大丈夫でした。シェル構文を一度学んだfor
ので、そうです。
for filename in *.mp4 ; do
mv "${filename}" "$(echo "${filename}" | sed 's/regex/replacement/')"
done
少なくとも私にとっては覚えやすく、bash、zsh、その他のBourneなどのシェルで動作するはずです。私が学ぶべき追加のコマンドではありません。
実際に仕事を簡単にするためには、自分が好むシェルの変数拡張を最大限に活用できます。
#!/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