我通常使用find命令自动将某些多媒体文件从目录A复制到目录B。我使用以下命令:
for f in `find ./ -name "*.mkv" -mtime -24h`; do cp $f rename/ ; done
这完全符合我的要求,但现在我已经将命令转移到可执行脚本中(我们称之为它mmcopy
,它工作完美)我想知道我是否可以改进脚本以执行以下操作:
当我mmcopy
在命令行上输入时,我想解析脚本中的两个运算符/变量,即文件扩展名的变量和 mtime 运算符的变量,这样我就可以指定应该复制哪种类型的文件以及多久这些文件可能是。
例如:我想自动复制.jpg
目录中超过 3 天的(所有)文件,命令行应该如下所示mmcopy jpg -3d
我必须如何更改我的脚本才能做到这一点?
答案1
首先,当前的脚本会在包含空格和其他特殊字符的文件名上中断。解决这个问题非常容易:始终在变量替换周围使用双引号,并使用-exec
而不是解析find
.看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?了解更多信息。
find . -name "*.mkv" -mtime -24h -exec cp {} rename/ \;
传递给脚本的参数可在特殊参数 、 等中使用$1
。$2
下面的脚本复制文件,其扩展名是脚本的第一个参数,其时间戳比较由第二个参数给出。
#!/bin/sh
find . -name "*.$1" -mtime "$2" -exec cp {} rename/ \;
如果您想在参数丢失时采用默认值,您可以使用${…:-…}
参数扩展构造。
#!/bin/sh
find . -name "*.${1:-mkv}" -mtime "${2:--1d}" -exec cp {} rename/ \;
我建议替换cp
为cp -p
或rsync -a
。cp -p
保留文件上的时间戳,这样可以更轻松地判断您何时已经复制了文件。rsync -a
另外,如果文件已被复制,则不会复制该文件(除非原始文件具有不同的时间戳或大小)。