次の名前のファイルが複数あります。This is a test - AB12-1998.avi
(最後のコードは常に文字2、数字2、ダッシュ、数字4です)
私がしたいのは、次のように名前を変更することです。AB12-1998 - This is a test.avi
bash、名前変更、または作業が完了する限り、他の方法を使用して私に提供できるソリューションに感謝します。
答え1
Perlを使うrename
(*) :
rename 's/^(.*) - (.*)(\..*)$/$2 - $1$3/' *.avi
または、コードをより厳密に適用するには、次の手順を実行します。
rename 's/^(.*) - ([a-zA-Z]{2}\d{2}-\d{4})(\..*)$/$2 - $1$3/' *.avi
foo - bar - AB12-1234.avi
最初の名前が.*
最後の名前と一致するため、このような名前でも機能します<space><dash><space>
。
(*望むより:名前の変更、名前の変更、ファイルの名前変更など、すべての名前変更操作はどうなりますか?)
またはBashでも同様です。
for f in *.avi ; do
if [[ "$f" =~ ^(.*)\ -\ (.*)(\..*)$ ]]; then
mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
fi
done
つまり、正規表現は次のように分類されます。
^ start of string
( ) capture group
.* any amount of anything
\. a literal dot
$ end of string
Bashでスペースをエスケープするにはバックスラッシュを使用する必要がありますが(上記のように)、ほとんどの一般的な文字はそれ自体が一致します。キャプチャリンググループの内容は Perl では等の順序で現れ$1
、 Bash では等の順序で現れます。$2
${BASH_REMATCH[1]}
${BASH_REMATCH[2]}
答え2
使用/bin/sh
:
for name in *.avi; do
n=${name%.avi} # name without filename extension
first=${n%% - *} # first part of name
last=${n#* - } # last part of name
new="$last - $first.avi" # recombined new name
printf 'Would move "%s" to "%s"\n' "$name" "$new"
# mv -- "$name" "$new"
done
${parameter%%word}
で一致する最長のサフィックス文字列を削除し、 で一致する最短の接頭辞文字列を削除します。したがって、コードは最初の発生時に2つの部分文字列を置き換えます(スペース - ダッシュ - スペース)。word
$parameter
${parameter#word}
word
$parameter
-
mv
実際にファイル名を変更するには、推奨コンテンツを削除してください。
コメントからイルカチュウの答え、名前の最初の部分も変えたいですね。だからにAB12-1998
なります1998-AB12
。
これで名前を2回変更するので、それを関数に入れることができます。
swap () {
# swaps the two part of a string around
# the swap point is defined by the first argument
swstr=$1
string=$2
first=${string%%$swstr*}
last=${string#*$swstr}
printf '%s%s%s\n' "$last" "$swstr" "$first"
}
for name in *.avi; do
n=${name%.avi}
n=$( swap ' - ' "$n" )
first=${n%% - *}
first=$( swap '-' "$first" )
new="$first - ${n#* - }.avi"
printf 'Would move "%s" to "%s"\n' "$name" "$new"
# mv -- "$name" "$new"
done
出力例:
Would move "This is a test - AB9-1995.avi" to "1995-AB9 - This is a test.avi"
Would move "This is a test - AB9-1996.avi" to "1996-AB9 - This is a test.avi"
Would move "This is a test - AB9-1997.avi" to "1997-AB9 - This is a test.avi"
Would move "This is a test - AB9-1998.avi" to "1998-AB9 - This is a test.avi"
Would move "This is a test - AB9-1999.avi" to "1999-AB9 - This is a test.avi"