现在,在您面对手掌并点击重复条目之前,请继续阅读,这个问题既理论又实用。
从标题中可以看出我正在尝试做什么,找到一些文件,然后重命名它们。那么问题是,有很多方法可以做到这一点,我最终决定挑选一个,并试着从理论上解决这个问题。
让我设定阶段: 假设我有100个文件全部命名为Image_200x200_nnn_AlphaChars.jpg,其中 nnn 是增量数字, AlphaChars 即:
Image_200x200_001_BlueHat.jpg
Image_200x200_002_RedHat.jpg
...
Image_200x200_100_MyCat.jpg
进入查找阶段。现在有一个简单的单行程序,我可以找到这个目录中的所有图像文件。(不知道如何做这个不区分大小写的)
find . -type f -name "*.jpg"
进入重命名阶段。在它自己的名字上,重命名希望你做以下事情:
rename <search> <replace> <haystack>
当我尝试将两者与 -print0 和 xargs 以及一些正则表达式结合起来时,我会陷入困境,我几乎可以肯定它是因为重命名是寻找干草堆或搜索部分......(如果您了解管道后发生的事情,请解释)
find . -type f -name "*.jpg" -print0 | xargs -0 rename "s/Image_200x200_(\d{3})/img/"
所以我们的目标是让find重命名原始图片名称,并用 img
替换最后一个下划线之前的所有内容是的我知道重复会产生问题,是的我知道名字中的空格也会让我的生活变得糟透了,甚至不会从子目录等开始。为了简单起见,我们讨论的是单个目录,所有文件名都是唯一的,没有特殊字符。
在获得核心内容之前,我需要了解基本的基础知识。那里的任何人都想帮忙吗?
答案 0 :(得分:3)
另一种方法是避免使用rename
- bash足够强大:
find ... -print0 | while read -r -d '' filename; do
mv "$filename" "img_${filename##*_}"
done
##*_
部分删除所有前导字符,包括该值的最后一个下划线。
答案 1 :(得分:1)
如果您不需要-print0
(即您确定您的文件名不包含换行符),您可以这样做:
find . -type f -name "*.jpg" | xargs rename 's/Image_200x200_(\d{3})/img/'
哪个适合我:
~/tmp$ touch Image_200x200_001_BlueHat.jpg
~/tmp$ touch Image_200x200_002_RedHat.jpg
~/tmp$ touch Image_200x200_100_MyCat.jpg
~/tmp$ find . -type f -name "*.jpg" | xargs rename 's/Image_200x200_(\d{3})/img/'
~/tmp$ ls
img_BlueHat.jpg img_MyCat.jpg img_RedHat.jpg
在管道之后发生的事情是xargs正在解析find的输出并将其以合理的块传递给重命名命令,该命令正在对文件名执行正则表达式并将文件重命名为结果。
更新:我最初没有使用null-terminators尝试你的版本,但它也适用于我。也许你用不同的正则表达式进行了测试?
答案 2 :(得分:0)
管道后发生了什么:
find ... -print0 | xargs -0 rename "s/Image_200x200_(\d{3})/img/"
xargs
正在读取find
命令生成的文件名,并重复执行rename
命令,一次附加几个文件名。净效应将是:
rename '...' file001 file002 file003 file004 file005 file006 file007 file008 file009 file010
rename '...' file011 file012 file013 file014 file015 file016 file017 file018 file019 file010
rename '...' file021 file022 file023 file024 file025 file026 file027 file028 file029 file010
...
rename '...' file091 file092 file093 file094 file095 file096 file097 file098 file099 file100
find -print0 | xargs -0
是一个方便的组合,可以更安全地处理可能包含空格的文件。