gpt4 book ai didi

regex - Bash 正则表达式匹配行首的 "./"?或使用前导 "-"重命名文件

转载 作者:行者123 更新时间:2023-12-04 05:44:56 25 4
gpt4 key购买 nike

我正在尝试用空格和其他此类脚本破坏字符重命名文件。

该平台是 Ubuntu server 12(带有 Bash 4),任何“rename”命令的实例都是指 Prename aka Perl Rename。

我要么在编写合适的正则表达式时遇到问题,要么在从 find 命令创建有效变量时遇到问题。

这是我成熟命名的测试数据(所有文件,没有目录):

/test/-poop
/test/poopfile.txt
/test/po_________!!!!!!!! $$^^^ op.sh

(编辑)预期输出:我想将文件名更改为
/test/poop
/test/poopfile.txt
/test/po_op.sh

(/编辑)

如果我在/test 中运行此命令:
find * -type f -exec rename -n 's/[^a-zA-Z0-9-_.]/_/g; s/_+/_/g' {} \;

我当然得到:
find: unknown predicate `-poop'

所以我改变了一些东西:(find * -> find . 以便 find 命令的结果以 ./为前缀)
find . -type f -exec rename -n 's/[^a-zA-Z0-9-_.]/_/g; s/_+/_/g' {} \;

哪个返回
./-poop renamed as ._-poop
./poopfile.txt as ._poopfile.txt
./po_________!!!!!!!! $$^^^ op.sh renamed as ._po_op.sh

那不好。我所有的文件现在都以 _ 为前缀,因为我的正则表达式完全按照我的要求去做。如果我不必处理以“-”开头的文件,那么我会很好,但这正是我试图用这个脚本处理的那种事情。

这就是我卡住的地方 - 我不知道如何让我的正则表达式不匹配一行中的前两个字符或“./”的第一个实例
^.{2} ## matches the first two characters in the string
^./ ## matches the ./ at the start of the line (assuming I change my delimiter from /)

但是我怎么说“不是字符串中的前两个字符并且不是 [a-zA-Z0-9.-_] 中的字符的任何东西?”

或者

我这样做完全错误吗?有没有办法可以将 find 命令的结果传递给重命名脚本,以便前导“-”不会导致 find 停止?

实际上在考虑这些方面 - 我写了这个:
for f in $( find . -type f ); do
p=$( printf "%s\n" "$f" | sed 's/^..//' );
rename -n 's/[^a-zA-Z0-9-_.]/_/g; s/_+/_/g' "$p";
done

结果:
Unknown option: p
Unknown option: o
Unknown option: o
Unknown option: p
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

因此,即使我可以找到将“-poop”重命名为“-poop”的手,它仍然在前导连字符上呕吐。

很确定答案就在正则表达式中。

我非常感谢可以提供的任何指导!这是我在这里的第一个问题 - 如果我犯了错误或礼仪错误,请告诉我。我很清楚我对正则表达式的了解很差,但我认为我已经达到了不问问题将是愚蠢的做法的地步。

最佳答案

使用 rename -n -- $regex $filenames .

这里的关键是-- ,这是一种广泛使用的方法,表示“选项从这里结束,文件名从这里开始”。 find itself doesn't support it ,但是 rename确实。

Some more details here.

关于regex - Bash 正则表达式匹配行首的 "./"?或使用前导 "-"重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com