0

これで、次のような名前変更スクリプトができました。

cd /Users/KanZ/Desktop/Project/Test/ 
n=1
for file in *.jpg; do 
    echo $file
    prefix=M
    file_name=M$n.jpg 
    echo $file_name
    n=$(( $n+1 ))
    mv $file $file_name 
done 

最初にスクリプトを実行すると、すべてのjpgファイルはM1.jpg M2.jpg M3.jpgになりますが、このディレクトリに新しいファイル名A1.jpgを追加して、スクリプトを再度実行します。最初の文字がAであるため、すべてのM1.jpg M2.jpg M3.jpgはM4.jpg(スクリプトを実行する前、このファイルはA1.jpgという名前)に置き換えられます。これはMの前にあります。これが私の問題です。M1 M2 M3 M4.jpgを取得したいのですが、新しいファイルが来るたびに、このスクリプトはM5.jpgM6.jpgのような継続名を生成します。コードはどのように見えますか?あなたがそれを理解することを望みます。助けてくれてありがとう

4

3 に答える 3

0

これまでに与えられた他の答えはあなたに良い習慣を示していません。

これは、番号付けが連続的である(つまり、からへのジャンプがない)ことを前提とする1つの可能性です。その仮定がなければ、スクリプトは安全です(既存のファイルを上書きしませんが、特定のファイルの名前を変更しません)。M4.jpgM6.jpg

#!/bin/bash

shopt -s extglob
shopt -s nullglob

cd /Users/KanZ/Desktop/Project/Test/

# Determine how many files MX.jpg you have (with X a number):
files=( M+([[:digit:]]).jpg )
n=${#files[@]}

for file in !(M+([[:digit:]])).jpg; do
    file_name=M$((++n)).jpg
    mv -vn -- "$file" "$file_name"
done
  • 次の-nオプションmv:クローバーなし(既存のファイルを上書きしないでください)
  • :冗長にする-vオプションmv(つまり、持っていたエコーは必要ありません)
  • 事柄:オプションの--終わり、引数のみが後ろにあります(一部のファイルがハイフンで始まる場合に備えて、混乱しますmv)。
于 2012-12-23T08:26:02.747 に答える
-1

この小さなスクリプトがそれを行います。

cd /Users/KanZ/Desktop/Project/Test/ 
n=$(ls -1 | grep '^M' -c)                    # find the number for M files 
ls -1 *.jpg| grep -v '^M' | while read file  # for each of the non-M files
do 
   n=$(($n+1));                       
   new_file=M$n.jpg                          # new name with next available M file name
   mv "$file" "$new_file"                        # rename with new file name
done 

それがどのように機能するかをご覧ください。

test/rename$ for x in 1 2 3; do echo A$x> A$x.jpg; done;
test/rename$ ls
A1.jpg  A2.jpg  A3.jpg
test/rename$ cat ../rnm.sh 
#!/bin/bash
cd "$1"
n=$(ls -1 | grep '^M' -c)
nfiles=$(ls -1 *.jpg| grep -v '^M');
for file in $nfiles;
do 
   n=$(($n+1));
   new_file=M$n.jpg
   mv $file $new_file
done 
test/rename$ bash ../rnm.sh  ./
test/rename$ ls
M1.jpg  M2.jpg  M3.jpg
test/rename$ for x in 1 2 ; do echo B$x> B$x.jpg; done;
test/rename$ ls
B1.jpg  B2.jpg  M1.jpg  M2.jpg  M3.jpg
test/rename$ bash ../rnm.sh  ./
test/rename$ ls
M1.jpg  M2.jpg  M3.jpg  M4.jpg  M5.jpg
test/rename$ for x in *.jpg; do echo $x; cat $x; done;
M1.jpg
A1
M2.jpg
A2
M3.jpg
A3
M4.jpg
B1
M5.jpg
B2
于 2012-12-23T03:29:45.143 に答える
-1

私があなたの要件を理解した方法は:

すべての.jpgファイル名を、任意の名前からM * .jpgに変更し、Mの後に増分番号を付けます。

プログラムを複数回実行すると、最後の実行時に設定されたMファイルの最大値からカウントが増加するはずです。たとえば、プログラムの最初の実行でM1、M2、M3が作成された後、さらにファイルを追加する場合、それらはM4、M5、M6から開始する必要があります。

ただし、M1、M2、M3自体は変更しないでください。

だからいくつかの提案:

スクリプトの開始時にn=1を設定しています。前回の実行のファイルに存在するMx.jpgの最大値を使用する必要があります。

次に、ファイルを探して反復するときは、名前が置き換えられないように、すべてのM*.jpgファイルを除外します。

これがあなたの要件だと思いますか?追加の入力がある場合は、コメントを追加してください。次のコメントでスクリプトを送信します。

テストケース:既存のファイル、X.jpg、ASG.jpg、GER.jpg実行後のファイル名:M1.jpg、M2.jpg、M3.jpg

追加のファイルを使用せずに最初の実行後にスクリプトをもう一度実行する場合:ファイル名(M1.jpg、M2.jpg、M3.jpg)に変更はありません。

次に、ファイルを追加します:Z.jpg、A.jpg、B.jpgファイル名は次のように変更する必要があります:

M1.jpg => M1.jpg、M2.jpg => M2.jpg、M3.jpg => M3.jpg、A.jpg => M4.jpg、B.jpg => M5.jpg、Z.jpg => M6.jpg。したがって、ファイル名はM1.jpg、M2.jpg、M3.jpg、M4.jpg、M5.jpg、M6jpgになります。

于 2012-12-23T03:19:43.817 に答える