私はsmplayerを使用していますが、ファイルを自然な順序で並べ替えません。たとえば、再生後に代わり1*.sth
に移動します。しかし、私が確認したようにファイル名を0に変更すると、プレーヤーは正しいファイルソートで終わります。順番に。 (ダッシュ、スペース、ドットなどの文字を意味します。)今、すべてのビデオファイルとsrtファイルを確認し、ゼロで埋める(可能な場合)ワンタイム実行コード行を作成しようとしています。名前を変更する必要があるすべてのファイルを見つけるには、次のコードがあります。11*.sth
2*.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
コマンドがある場合:perl
File::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より小さい一連の数字で始まる通常のファイルに適用されます。
find
GNUならBSDで同等の実装find
の-E .
ために。. -regextype posix-extended
-E
find