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


12

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

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

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

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

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

回答:


10

を使用している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

それはほぼ完璧です!(1)接頭辞または接尾辞がすでに存在するかどうかをチェックしてから(スキップして)、(2)拡張子のないファイルを処理すると完璧です。大変ご迷惑をおかけして申し訳ありません...
そのブラジル人

(1)では、mvをラップしてプレフィックスチェックを追加できます(テストされていないと思います)。addsuffixのmvコマンドの前後でif [ $f == $prefix* ]サフィックスを変更できif [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]ます。(2)については、私が恐ろしいプログラマーでない限り、拡張子のないファイルで既に動作するはずです。
アーロン岡野

7

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

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

文字列の(長さゼロの)開始(^)を置き換えるか、開始に続いてオプションのprefix文字列をで置き換えることで機能しますprefix

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

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


それはいい答えですが、もっと普遍的なものを探していました。この答えには、perlとこの特定の(または同等の)両方が存在する必要がありますrename。そして、接尾辞が少し難しいこと、リンクされた質問でカバーされていなかったこと、そして私はLinux、bash、シェルスクリプト、perlおよび正規表現の初心者なので、「少し難しい」ことは私にとって非常に難しいことを知っています!:)
そのブラジル人の男


1

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

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

変更する前にデータにどのように影響するかを確認する場合は、mvechoに置き換えます

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.