こんにちは、私はバッチファイルの名前を変更するための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
答え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
~