我对bash比较陌生,我已经尝试了这里可以找到的多种解决方案,但似乎没有一种适合我的情况。这很简单,我有一个文件夹,看起来像这样:
- images/
- 0_image_1.jpg
- 0_image_2.jpg
- 0_image_3.jpg
- 1_image_1.jpg
- 1_image_2.jpg
- 1_image_3.jpg
我想移动这些jpg文件到子文件夹的基础上的前缀号码,这样:
- images_0/
- 0_image_1.jpg
- 0_image_2.jpg
- 0_image_3.jpg
- images_1/
- 1_image_1.jpg
- 1_image_2.jpg
- 1_image_3.jpg
有没有一个bash命令可以用一种简单的方式来实现这一点?谢谢
3条答案
按热度按时间e0uiprwp1#
如果输出正常,则删除两个
echo
.8mmmxcuj2#
我会用
rename
(也叫Perl rename
)来实现这一点。它的功能非常强大,性能也非常好。下面是一个适合您的用例的命令:让我们仔细分析一下。在右端,我们指定我们只想处理以下划线前的单个字符/数字开头的文件,这样我们就不会在试图将命令应用于不适合的文件时造成损害。然后
--dry-run
意味着它实际上什么也不做,它只是向你展示它会做什么-这是一个非常有用的特性。然后是-p
,它方便地表示 “在你去的时候为我创建任何必要的目录”。然后是命令的内容。它将当前文件名传递给一个名为$_
的变量,然后我们需要创建一个名为$_
的新变量来指定文件名。在本例中,我们只需要在images_
后面加上现有文件名的第一个数字,然后再加上一个斜杠和原始文件名。简单!输出示例
删除--dry-run,如果输出看起来不错,则再次真实的运行。
使用
rename
有几个好处:注意:在macOS上,您可以使用homebrew安装
rename
:注:在某些1上,
rename
被称为Perl rename
的prename
。2lpgd9683#
What about this:
Assuming the image filename has single digit prefix,
newdir
name is formed by appending a suffix of the first character of the filename (${file:0:1}
- 0 is the offset and length is 1). And if directorynewdir
does not exist, create one. Finally, move file from old to new.If the filename could have a multi-digit prefix like 10_image.jpg, use this: