ファイル名セットからn番目の文字を削除する方法は?

ファイル名セットからn番目の文字を削除する方法は?

こんにちは、私はバッチファイルの名前を変更するためのbashソリューションを探しています。低速撮影映像に取り込むデジタルカメラのファイルがあります。

1000個の画像JPGファイルの名前が変更されるたびに、次のようにジャンプします。

./P1020998.JPG
./P1020999.JPG
./P1030001.JPG
./P1030002.JPG

After Effectsにインポートすると、画像の数が連続して表示されるように5番目の場所から「0」を削除できる再利用可能なシェルコマンドをハッキングしようとしています。

ファイル名セットからn番目の文字を削除する最も速く簡単な方法を知っている人はいますか?私はいつもそのディレクトリにある一連の画像に加えて、他のファイルがないディレクトリに画像をグループ化します。

検索してみたところ、これまでの回避策はファイル名から「0」文字をすべて削除するようでした。これは私が特に望むものではありません。ただ5番目の文字を削除することは私が望む結果です。時間をかけてこの質問に答えてくれてありがとう。

答え1

使用している機能に関するマニュアルページを引用することをお勧めします。次のEXPANSIONセクションではman bash

${parameter:offset:length}
       Substring  Expansion.  Expands to up to length characters of the value of parameter starting at the character specified by offset.  If parameter is @, an 
       indexed array subscripted by @ or *, or an associative array name, the results differ as described below.  If length is omitted, expands to the substring
       of  the value of parameter starting at the character specified by offset and extending to the end of the value.  length and offset are arithmetic expres‐
       sions (see ARITHMETIC EVALUATION below).

       If offset evaluates to a number less than zero, the value is used as an offset in characters from the end of the value of parameter.  If length evaluates
       to  a  number less than zero, it is interpreted as an offset in characters from the end of the value of parameter rather than a number of characters, and
       the expansion is the characters between offset and that result.  Note that a negative offset must be separated from the colon by at least  one  space  to 
       avoid being confused with the :- expansion.

内部的に算術演算を実行できるため、${}次のようにコードをパラメータ化できます。

#!/bin/bash
position=5

for f in *JPG; do
   mv -- "$f" "${f:0:$position-1}${f:$position}"
done

exit

ここに迅速かつ汚れた解決策があります。ファイル名の長さやその他はチェックしませんが、このようなハッカーには問題ありません。

答え2

rename(Perlの名前変更または)を使用してくださいprename

rename -nv 's/^(.{4})0/$1/' ./*.jpg

私達は以下を取り替えます:

  • ^文字列の先頭をアサーション
  • (.{4})最初のキャプチャグループで、逆参照$1点は.すべての文字(ewlineを除く\n)と一致し、{4}前のトークンと正確に4回一致します。
  • 0文字0に一致します。

上記のキャプチャグループの内容のみを使用すると、結果は5番目の文字位置からゼロ文字を削除することになります(常に0番目の文字と一致するのではなく、5番目の位置 ewlineを除く)から$1任意の文字を削除して0を置き換えることができます。 )。.\n

regexper.comで作成

答え3

それは重要ではありません!シェルスクリプトソリューションを学びます。同じ問題があり、ここに来る人のために私が使用するシェルコードは次のとおりです。

cd DIRECTORYPATH         ## Navigate to directory with images

for f in *; do           ## Begin for loop with each file in directory
    x="${f::4}"          ## Set x as first 4 characters
    y="${f:5}"           ## Set y as all characters past position 5
    mv -- "$f" "$x$y"    ## Use mv command to rename each file as string x+y
done

答え4

別の方法はsed

#!/bin/bash

cd $DIRECTORYPATH 

for f in *.JPG 
do
    mv $f $(echo $f | sed -e 's/\(^P[0-9]\{3\}\)0\([0-9]*\.JPG\)/\1\2/')
done

~

関連情報