我使用smplayer,它不按自然顺序排序文件,例如,在播放1*.sth之后,它将跳转到11*.sth而不是2*.sth。但是,当我检查是否将文件名更改为零时,此播放器将按正确的顺序对文件进行排序。( *指的是任何字符,如破折号、空格、点等。)现在,我试图写一行,如果可能的话,一次可执行代码,将检查和零垫所有视频和srt文件。我有以下代码来查找需要重命名的所有文件:
~~ 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脚本对文件名进行零填充,并将此函数用作find方法的D10标志的命令。
这段代码
awk '{ split($0, arr, "/"); print arr[2] }'我有一个为我工作的python脚本,但我希望找到一个单行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"))))
发布于 2023-05-27 15:37:16
例如,将所有mp4和srt文件的开头的数字改为零垫到4,并使用zsh:
autoload -Uz zmv
zmv '(**/)(<->)(*.(mp4|srt))(#q.)' '$1${(l[4][0])2}$3'或者,如果您有来自perl's File::Rename的D5命令:
find . '(' -name '*.mp4' -o -name '*.srt' ')' -type f -print0 |
rename -0d 's/^\d+/sprintf "%04d", A7/e'注意,在支持-regex的find实现中,它与整个路径匹配,而不仅仅是文件名,默认情况下是锚定的。
在……里面
找出来。-type f -regex“.*.”
所有路径都将从./开始。例如,可以是./dir/01.mp4,它与regexp匹配,因为它以0 (.)以外的字符(D15)开头,后面跟着0或多个字符,后面跟着.mp4。
你的意思可能是:
find . '(' -name '[123456789]*.mp4' -o -name '[123456789]*.srt' ')' -type f若要查找名称以0以外的数字开头的常规文件,请执行以下操作。
或者:
find -E . -regex '.*/[0123456789]{1,3}([^0123456789/][^/]*)?\.(mp4|srt)' -type f对于名称以长度小于4的数字序列开头的常规文件。
如果您的find是GNU find,则将-E .替换为. -regextype posix-extended。-E与在BSD上找到的find实现相当。
https://unix.stackexchange.com/questions/747241
复制相似问题