首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用find和execdir标志的零衬垫文件名

使用find和execdir标志的零衬垫文件名
EN

Unix & Linux用户
提问于 2023-05-27 10:03:18
回答 1查看 60关注 0票数 -1

我使用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' ~~

代码语言:javascript
复制
find . '(' -name '[1-9]*.mp4' -o -name '[1-9]*.srt' ')' -type f

我知道find有一个execdir标志,它将执行一个命令,指定的命令从包含匹配文件的子目录中运行。这个信息很有用,因为如果我想从目录树的最上面的节点运行结果命令,那么我就不需要担心文件位于哪里了。现在的问题是,我不知道如何使用bash脚本对文件名进行零填充,并将此函数用作find方法的D10标志的命令。

这段代码

代码语言:javascript
复制
awk '{ split($0, arr, "/"); print arr[2] }'

我有一个为我工作的python脚本,但我希望找到一个单行bash脚本来完成这项工作。

代码语言:javascript
复制
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"))))
EN

回答 1

Unix & Linux用户

发布于 2023-05-27 15:37:16

例如,将所有mp4srt文件的开头的数字改为零垫到4,并使用zsh

代码语言:javascript
复制
autoload -Uz zmv
zmv '(**/)(<->)(*.(mp4|srt))(#q.)' '$1${(l[4][0])2}$3'

或者,如果您有来自perl's File::RenameD5命令:

代码语言:javascript
复制
find . '(' -name '*.mp4' -o -name '*.srt' ')' -type f -print0 |
  rename -0d 's/^\d+/sprintf "%04d", A7/e'

注意,在支持-regexfind实现中,它与整个路径匹配,而不仅仅是文件名,默认情况下是锚定的。

在……里面

找出来。-type f -regex“.*.”

所有路径都将从./开始。例如,可以是./dir/01.mp4,它与regexp匹配,因为它以0 (.)以外的字符(D15)开头,后面跟着0或多个字符,后面跟着.mp4

你的意思可能是:

代码语言:javascript
复制
find . '(' -name '[123456789]*.mp4' -o -name '[123456789]*.srt' ')' -type f

若要查找名称以0以外的数字开头的常规文件,请执行以下操作。

或者:

代码语言:javascript
复制
find -E . -regex '.*/[0123456789]{1,3}([^0123456789/][^/]*)?\.(mp4|srt)' -type f

对于名称以长度小于4的数字序列开头的常规文件。

如果您的find是GNU find,则将-E .替换为. -regextype posix-extended-E与在BSD上找到的find实现相当。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/747241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档