find および execdir フラグを使用したゼロパディングファイル名

find および execdir フラグを使用したゼロパディングファイル名

私はsmplayerを使用していますが、ファイルを自然な順序で並べ替えません。たとえば、再生後に代わり1*.sthに移動します。しかし、私が確認したようにファイル名を0に変更すると、プレーヤーは正しいファイルソートで終わります。順番に。 (ダッシュ、スペース、ドットなどの文字を意味します。)今、すべてのビデオファイルとsrtファイルを確認し、ゼロで埋める(可能な場合)ワンタイム実行コード行を作成しようとしています。名前を変更する必要があるすべてのファイルを見つけるには、次のコードがあります。11*.sth2*.sth*

~~~~~ find . -type f -regex "[^0].*\.\(mp4\|srt\)"
find . -type f -name '[1-9]*.mp4' -o -name '[1-9]*.srt'

find . '(' -name '[1-9]*.mp4' -o -name '[1-9]*.srt' ')' -type f

findコマンドを実行するフラグがあり、execdir指定されたコマンドは一致するファイルを含むサブディレクトリで実行されることがわかります。この情報は、ディレクトリツリーの最上位ノードで結果コマンドを実行したい場合は、ファイルがどこにあるのか心配する必要がないため便利です。これで問題は、bashスクリプトを使用してファイル名をゼロパッドし、この関数をメソッド-execdirフラグのコマンドとして使用する方法がわからないことですfind

このコードは

awk '{ split($0, arr, "/"); print arr[2] }'

私に合ったPythonスクリプトがありますが、これを行うために1行のbashスクリプトを探しています。

import subprocess
from pathlib import Path

cmd = r'find ./ -type f -regex "[^0].*\.\(mp4\|srt\)"'
exc = subprocess.check_output(cmd, shell=True)

pathes = list(map(bytes.decode, exc.splitlines()))
files = list(map(Path, pathes))

for file in files:
    if file.name[0].isdigit() and file.name[0] != "0":
        num = ""
        for char in file.name:
            if not char.isdigit():
                break
            num += char
        file.rename(file.with_name(file.name.replace(num, num.rjust(3, "0"))))

ここに画像の説明を入力してください。

答え1

mp4長さ4にゼロを埋めるには(たとえば、すべてのファイルの先頭にある数字)、次のようにsrtしますzsh

autoload -Uz zmv
zmv '(**/)(<->)(*.(mp4|srt))(#q.)' '$1${(l[4][0])2}$3'

または、次のrenameコマンドがある場合:perlFile::Rename

find . '(' -name '*.mp4' -o -name '*.srt' ')' -type f -print0 |
  rename -0d 's/^\d+/sprintf "%04d", $&/e'

-regexこれをサポートする実装では、findファイル名だけでなくフルパスと一致し、デフォルトで固定されています。

存在する

find . -type f -regex "[^0].*\.\(mp4\|srt\)"

すべてのパスはで始まります./。たとえば./dir/01.mp4、()以外の文字で始まり、その後にゼロ個以上の文字が続き、その後に続くため、この正規表現と一致することがあります。0..mp4

意味するものは次のとおりです。

find . '(' -name '[123456789]*.mp4' -o -name '[123456789]*.srt' ')' -type f

一般的なファイルを探す名前ゼロ以外の数字で始めてください。

または:

find -E . -regex '.*/[0123456789]{1,3}([^0123456789/][^/]*)?\.(mp4|srt)' -type f

名前が4より小さい一連の数字で始まる通常のファイルに適用されます。

findGNUならBSDで同等の実装find-E .ために。. -regextype posix-extended-Efind

関連情報