web-dev-qa-db-ja.com

プレフィックスまたはサフィックスを追加して、ローカルフォルダー内のファイルの名前を変更する

フォルダーに多くのファイルがあり、それらにプレフィックスまたはサフィックス(bothではない)を追加したい。私は ここ をチェックし、私が使用できることがわかりました

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

.jpgで終わるすべてのファイルにプレフィックスを追加します(.jpgを削除すると、現在のフォルダー内のすべてのファイルにプレフィックスが追加されます)。

しかし、私はできるようになりたいです

  • サフィックスを追加します(つまり、filename.extfilename.whatever.extに名前変更します)。
  • 接頭辞または接尾辞がすでに存在するかどうかを確認してからスキップします。
  • addprefix whatever *.extaddsufix whatever *.*などの引数を受け入れるエイリアスを作成します
13

bashを使用している場合は、このワンライナーでそれを行うことができます(変数$prefix$suffixおよび$extension すぐに利用できる)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

あなたのスクリプトはこのようにすることができます

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

そして

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
11
Aaron Okano

Perl rename command があります。ただし注意してください:renameと呼ばれるいくつかの異なるコマンドがあるので、引数としてperlexprを期待するPerlスクリプトがあることを確認してください。これは、Debianおよび派生物(Ubuntu、Mintなど)のrenameパッケージによって提供されるPerlコマンドですが、renameと呼ばれる別のユーティリティを持つ他のディストリビューションでは提供されません。

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

ご覧のとおり、それは idempotent です。複数回呼び出しても、プレフィックスは再度追加されません。

文字列の(長さゼロ)の開始を置き換えることによって機能します(^)または先頭にオプションのprefix文字列が続き、prefix

演習として、これをシェルスクリプトまたはシェル関数のいずれかにカプセル化しておきます。

ただし、ファイル名のどの部分が拡張子を構成しているかを把握する必要があるため、Postfixは少し難しいです...

7

zshの場合:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~は、zshの-​​exceptを意味するグロビング演算子です。

4

現在のフォルダー内のすべての画像のプレフィックスと拡張子を変更する簡単な例。

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

変更する前にデータに与える影響を確認する場合は、mvechoに置き換えてください。

iMG_7993.JPGの出力はEG_IMG_7993.jpgです

2
Jinxi