37

私は次のような名前のファイルをたくさん持っています:

output_1.png
output_2.png
...
output_10.png
...
output_120.png

規則に一致するようにそれらの名前を変更する最も簡単な方法は何ですか。たとえば、最大4つの小数点を使用して、ファイルに名前を付けます。

output_0001.png
output_0002.png
...
output_0010.png
output_0120.png

これはUnix/Linux / BSDでは簡単なはずですが、私はWindowsにもアクセスできます。どんな言語でも構いませんが、私はいくつかの本当にきちんとしたワンライナーに興味があります(もしあれば?)。

4

10 に答える 10

56

Python

import os
path = '/path/to/files/'
for filename in os.listdir(path):
    prefix, num = filename[:-4].split('_')
    num = num.zfill(4)
    new_filename = prefix + "_" + num + ".png"
    os.rename(os.path.join(path, filename), os.path.join(path, new_filename))

「output_」で始まり「.png」で終わるすべてのファイルが有効なファイルであると仮定して、有効なファイル名のリストをコンパイルできます。

l = [(x, "output" + x[7:-4].zfill(4) + ".png") for x in os.listdir(path) if x.startswith("output_") and x.endswith(".png")]

for oldname, newname in l:
    os.rename(os.path.join(path,oldname), os.path.join(path,newname))

バッシュ

(from:http ://www.walkingrandomly.com/?p=2850 )

つまり、file1.pngをfile001.pngに、file20.pngをfile020.pngに置き換えます。これがbashでそれを行う方法です

#!/bin/bash
num=`expr match "$1" '[^0-9]*\([0-9]\+\).*'`
paddednum=`printf "%03d" $num`
echo ${1/$num/$paddednum}

上記をと呼ばれるファイルに保存zeropad.shし、次のコマンドを実行して実行可能にします

chmod +x ./zeropad.sh

zeropad.shその後、次のようにスクリプトを使用できます

./zeropad.sh frame1.png

結果を返します

frame001.png

残っているのは、このスクリプトを使用して、現在のディレクトリ内のすべての.pngファイルの名前をゼロパッドになるように変更することだけです。

for i in *.png;do mv $i `./zeropad.sh $i`; done

Perl

(from:ゼロパッドの名前変更(例:Image(2).jpg-> Image(002).jpg

use strict;
use warnings;
use File::Find;

sub pad_left {
   my $num = shift;

   if ($num < 10) {
      $num = "00$num";
   }
   elsif ($num < 100) {
      $num = "0$num";
   }

   return $num;
}

sub new_name {
   if (/\.jpg$/) {
      my $name = $File::Find::name;
      my $new_name;
      ($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
      rename($name, $new_name);
      print "$name --> $new_name\n";
   }
}

chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the
                            # image-containing sub-directories

find(\&new_name, $localdir);

名前を変更

上記の回答からも:

rename 's/\d+/sprintf("%04d",$&)/e' *.png
于 2011-03-24T10:54:53.180 に答える
13

すぐにはわからないいくつかの機能を組み合わせていますが、かなり簡単です。

@echo off
setlocal enableextensions enabledelayedexpansion
rem iterate over all PNG files:
for %%f in (*.png) do (
    rem store file name without extension
    set FileName=%%~nf
    rem strip the "output_"
    set FileName=!FileName:output_=!
    rem Add leading zeroes:
    set FileName=000!FileName!
    rem Trim to only four digits, from the end
    set FileName=!FileName:~-4!
    rem Add "output_" and extension again
    set FileName=output_!FileName!%%~xf
    rem Rename the file
    rename "%%f" "!FileName!"
)

編集:あなたがバッチファイルではなく、任意の言語の任意のソリューションを求めていると誤解してください。そのために残念。これを補うために、PowerShellワンライナー:

gci *.png|%{rni $_ ('output_{0:0000}.png' -f +($_.basename-split'_')[1])}

?{$_.basename-match'_\d+'}そのパターンに従わない他のファイルがある場合は、そこに貼り付けてください。

于 2011-03-24T11:55:02.147 に答える
7

私は実際にOSXでこれを行う必要がありました。これが私が作成したスクリプトです-1行です!

> for i in output_*.png;do mv $i `printf output_%04d.png $(echo $i | sed 's/[^0-9]*//g')`; done
于 2015-02-09T22:59:00.510 に答える
3

一括名前変更の場合、唯一の安全な解決策はmmv、衝突をチェックし、チェーンとサイクルでの名前変更を可能にすることです。これは、ほとんどのスクリプトを超えています。残念ながら、ゼロパディングはそれほど熱くはありません。フレーバー:

c:> mmv output_[0-9].png output_000#1.png

1つの回避策は次のとおりです。

c:> type file
mmv
[^0-9][0-9] #1\00#2
[^0-9][0-9][^0-9] #1\00#2#3
[^0-9][0-9][0-9] #1\0#2#3
[^0-9][0-9][0-9][^0-9] #1\0#2#3
c:> mmv <file
于 2011-03-24T12:09:54.327 に答える
2

これは私が書いたPythonスクリプトで、存在する最大数に応じてゼロを埋め込み、指定されたディレクトリ内の番号のないファイルを無視します。使用法:

python ensure_zero_padding_in_numbering_of_files.py /path/to/directory

スクリプトの本文:

import argparse
import os
import re
import sys

def main(cmdline):

    parser = argparse.ArgumentParser(
        description='Ensure zero padding in numbering of files.')
    parser.add_argument('path', type=str,
        help='path to the directory containing the files')
    args = parser.parse_args()
    path = args.path

    numbered = re.compile(r'(.*?)(\d+)\.(.*)')

    numbered_fnames = [fname for fname in os.listdir(path)
                       if numbered.search(fname)]

    max_digits = max(len(numbered.search(fname).group(2))
                     for fname in numbered_fnames)

    for fname in numbered_fnames:
        _, prefix, num, ext, _  = numbered.split(fname, maxsplit=1)
        num = num.zfill(max_digits)
        new_fname = "{}{}.{}".format(prefix, num, ext)
        if fname != new_fname:
            os.rename(os.path.join(path, fname), os.path.join(path, new_fname))
            print "Renamed {} to {}".format(fname, new_fname)
        else:
            print "{} seems fine".format(fname)

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
于 2014-12-17T23:19:47.640 に答える
1
$rename output_ output_0 output_?   # adding 1 zero to names ended in 1 digit
$rename output_ output_0 output_??  # adding 1 zero to names ended in 2 digits
$rename output_ output_0 output_??? # adding 1 zero to names ended in 3 digits

それでおしまい!

于 2014-07-17T21:27:32.910 に答える
0

私はOSX用のAdamのソリューションをフォローしています。

私のシナリオで遭遇したいくつかの落とし穴は次のとおりです。

  1. 私は.mp3ファイルのセットを持っていたので、sedは「 .mp3」サフィックスの「 3」をキャッチしていました。(これを修正するために、echoの代わりにbasenameを使用しました)
  2. 私の.mp3の名前には、「audio track 1.mp3」のようにスペースが含まれていました。これにより、basename + sedが少し混乱したため、「$i」パラメータを引用する必要がありました。

結局、私のコンバージョンラインは次のようになりました。

for i in *.mp3 ; do mv "$i" `printf "track_%02d.mp3\n" $(basename "$i" .mp3 | sed 's/[^0-9]*//g')` ; done
于 2018-02-01T10:29:09.997 に答える
0

使用ls + awk + sh

ls -1 | awk -F_ '{printf "%s%04d.png\n", "mv "$0" "$1"_", $2}' | sh

コマンドを実行する前にテストする場合は、コマンドを削除してください。| sh

于 2020-11-15T15:16:17.930 に答える
0

bash分割で、

Linux

for f in *.png;do n=${f#*_};n=${n%.*};mv $f $(printf output_"%04d".png $n);done

windows(bash)

for f in *.png;do n=${f#*_};mv $f $(printf output_"%08s" $n);done
于 2021-04-29T03:54:12.620 に答える
0

使ってタイムラプス動画を作りたい

ffmpeg  -pattern_type glob -i "*.jpg" -s:v 1920x1080 -c:v libx264 output.mp4 

同様の問題が発生しました。

[image2 @ 000000000039c300]パターンタイプ「glob」が選択されましたが、このlibavformatビルドではグロブはサポートされていません

globはWindows7ではサポートされていません。また、以下のようなファイルリストの場合、%2d.jpgまたは%02d.jpgを使用します

1.jpg 2.jpg ... 10.jpg11.jpg..。

[image2 @ 00000000005ea9c0] Could find no file with path '%2d.jpg' and index in the range 0-4  
%2d.jpg: No such file or directory 
[image2 @ 00000000005aa980] Could find no file with path '%02d.jpg' and index in the range 0-4  
%02d.jpg: No such file or directory

これがハエの名前を変更するための私のバッチスクリプトです

@echo off
setlocal enabledelayedexpansion

set i=1000000
set X=1
for %%a in (*.jpg) do (
    set /a i+=1
    set "filename=!i:~%X%!"
    echo ren "%%a" "!filename!%%~xa"
    ren "%%a" "!filename!%%~xa"
)

143,323 jpgファイルの名前を変更した後、

ffmpeg -i %6d.jpg -s:v 1920x1080 -c:v libx264 output.mp4 
于 2021-08-10T03:19:42.370 に答える