Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Bash中,如何去掉目录中文件名中的所有数字,同时保持文件扩展名不变_Macos_Bash - Fatal编程技术网

Macos 在Bash中,如何去掉目录中文件名中的所有数字,同时保持文件扩展名不变

Macos 在Bash中,如何去掉目录中文件名中的所有数字,同时保持文件扩展名不变,macos,bash,Macos,Bash,我的目录中有如下文件: asdfs54345gsdf.pdf gsdf6456wer.pdf oirt4534724wefd.pdf 我想将所有文件重命名为number+.pdf,以便将上述文件重命名为: 54345.pdf 6456.pdf 4534724.pdf 最好是本机Bash命令或脚本(OSX 10.6.8) 我找到的一些线索包括 sed 's/[^0-9]*//g' input.txt sed 's/[^0-9]*//g' input.txt > output.txt

我的目录中有如下文件:

asdfs54345gsdf.pdf
gsdf6456wer.pdf
oirt4534724wefd.pdf
我想将所有文件重命名为number+.pdf,以便将上述文件重命名为:

54345.pdf
6456.pdf
4534724.pdf
最好是本机Bash命令或脚本(OSX 10.6.8)

我找到的一些线索包括

sed 's/[^0-9]*//g' input.txt 
sed 's/[^0-9]*//g' input.txt > output.txt 
sed -i 's/[^0-9]*//g' input.txt 
echo ${A//[0-9]/} rename 's/[0-9] //' *.pdf 
这应该做到:

for f in *.pdf 
do 
   mv "$f" "${f//[^0-9]/}.pdf"
done
但你最好先试试:

for f in *.pdf 
do 
   echo mv "$f" "${f//[^0-9]/}.pdf"
done
请注意,abc4.pdf和zzz4.pdf都将重命名为4.pdf。因此,您可能使用
mv-i
而不仅仅是mv

updte:解释: 我想第一部分很清楚
*.pdf
称为globbing,匹配所有文件,以.pdf结尾
对于f in…
只需迭代它们,每次将f设置为其中一个

for f in *.pdf 
do 
   mv "$f" "${f//[^0-9]/}.pdf"
done
我想

mv source target 
这也很清楚。如果文件名为“Unnamed File1”,则需要用引号将其屏蔽,否则mv将读取

mv Unnamed File1 1.pdf 
也就是说,它有多个要移动的文件,Unnamed和File1,并将1.pdf解释为将两个文件移动到的目录

好吧,我想真正的问题在这里:

"${f//[^0-9]/}.pdf"
有一个外胶字符。顺其自然

 foo=bar
一些变量赋值

 $foo
 ${foo}
 "$foo"
 "${foo}"
有四种合法的方式来引用它们。最后两个用于遮罩空白等,所以在某些情况下没有区别,在某些情况下是这样的

如果我们把东西粘在一起

 $foo4
 ${foo}4
 "$foo"4
 "${foo}"4
第一个表单将不起作用-shell将查找变量foo4。所有其他3个表达式都引用bar4-首先将$foo解释为bar,然后追加4。对于某些字符,不需要屏蔽:

 $foo/fool
 ${foo}/fool
 "$foo"/fool
 "${foo}"/fool 
都将以相同的方式进行解释。所以无论“${f/[^0-9]/}”是什么,${f//[^0-9]/}.pdf”都是附加在它后面的.pdf

我们将所有谜团的核心归结为:

${f//[^0-9]/}
这是形式的替换表达式

${variable//pattern/replacement}
  • 变量是$f(我们可以省略括号内的$f),上面是$f。那很容易
  • 替换是空的-这更容易
  • 但是[^0-9]确实很复杂,不是吗
-

只是0到9之间所有数字的组,其他组可以是:

[0-4] digits below 5
[02468] even digits
[a-z] lower case letters 
[a-zA-Z] all (common latin) characters 
[;:,/] semicolon, colon, comma, slash
第一个字符前面的插入符号^表示组的否定:

[^0-9] 
表示除0到9(包括点、逗号、冒号等)之外的所有内容都在组中。一起:

 ${f//[^0-9]/}
删除$f中的所有非数字,以及

"${f//[^0-9]/}.pdf"
整个事情都被掩盖了

 ${v//p/r}

参数扩展
一章中的
manbash
中解释了它的朋友(有很多有用的)。对于这个群体,我手头没有进一步阅读的资料。

这是一个帮助解决编程问题的网站,而不是“给我代码”。最好编辑您的问题,向我们展示您迄今为止的尝试。祝你好运。你应该研究正则表达式,命令
sed
awk
@shelleter,对不起,是的,我没有提到我花了两个小时在谷歌上搜索正则表达式等都没有用。我找到的一些线索包括sed的/[^0-9]*//g'input.txt sed的/[^0-9]*//g'input.txt>output.txt sed-I的/[^0-9]*///g'input.txt echo${A/[0-9]/}重命名的/[0-9]/'*.*。pdfI已经编辑了你的问题,将你的内容包括在评论中。在那里阅读要容易得多。请注意,要使代码出现在问题中,您需要在每行缩进4个空格,并在代码块前后各有一个空行。祝你好运,很好,谢谢。现在我需要弄清楚这是怎么回事。我想学习这一点,而不仅仅是复制和粘贴代码。:)@nube:我更新了我的答案来解释命令的每一部分。
 ${v//p/r}