我正在处理一个脚本,我需要将一个文件名与另一个文件进行比较,并查找特定的更改(在这种情况下,当OS X需要将文件添加到目录中时,当文件名时,将“(x)”添加到文件名中已经存在),因此这是脚本的摘录,已修改为无需其余脚本即可进行测试。
#!/bin/bash
p2_s2="/Path/to file (name)/containing - many.special chars.docx.gdoc"
next_line="/Path/to file (name)/containing - many.special chars.docx (1).gdoc"
file_ext=$(echo "${p2_s2}" | rev | cut -d '.' -f 1 | rev)
file_name=$(basename "${p2_s2}" ".${file_ext}")
file_dir=$(dirname "${p2_s2}")
esc_file_name=$(printf '%q' "${file_name}")
esc_file_dir=$(printf '%q' "${file_dir}")
esc_next_line=$(printf '%q' "${next_line}")
if [[ ${esc_next_line} =~ ${esc_file_dir}/${esc_file_name}\ \(?\).${file_ext} ]]
then
echo "It's a duplicate!"
fi
我在这里尝试执行的操作是检测文件next_line是否与p2_s2重复。由于我期望有多个重复项,因此next_line可以在文件名末尾或方括号中的任何其他数字后附加(1)(尽管我确定没有两位数)。由于我无法将简单的字符串与中间的通配符进行比较,因此我尝试使用“ =〜”运算符并将所有特殊字符转义。知道我在做什么错吗?
您可以修剪ps2_s2
的扩展名,修剪next_line
的扩展名(包括括号内的数字),并查看是否获得相同的文件名。如果您这样做-这是重复的。为此,[[
允许我们在字符串和Glob之间执行比较。
我使用了extglob的+( ... )
模式,因此可以+([0-9])
用来匹配括号内的数字。请注意,extglob已由启用shopt -s extglob
。
#!/bin/bash
p2_s2="/Path/to/ps2.docx.gdoc"
next_line="/Path/to/ps2(1).docx.gdoc"
shopt -s extglob
if [[ "${p2_s2%%.*}" = "${next_line%%\(+([0-9])\).*}" ]]; then
printf '%s is a duplicate of %s\n' "$next_line" "$p2_s2"
fi
现在,我看到您已经编辑了问题,因此,如果此解决方案不够用,我很肯定它将是一个很好的模板。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句