删除文件夹中所有文件名的一部分?

删除文件夹中所有文件名的一部分?

我的相机以以下格式存储照片:

DSC_0001 (2015_07_30 10_34_56 UTC).NEF

DSC_ 迭代后的数字以及指定时间和日期的括号,但是所有时间和日期信息都在元数据中,因此我希望将其生成的所有文件重命名为:

DSC_0001.NEF etc

我已经研究了renamebash 中的命令,但无法理解如何让它执行我想要的操作,我想更改文件夹中的所有文件。

如果您能解释为什么您的建议有效,我将不胜感激,这样我就可以尝试学习如何在将来解决类似的问题。

笔记:如果这有什么区别的话,我正在使用 Bash。

答案1

使用 Perl 重命名工具:

rename 's/ \(.*?\)//' *.NEF

正则表达式应该很简单(.*?匹配最短的字符串)。

很难看为什么 Debian/Ubuntu 上的重命名实用程序与其他发行版(例如 CentOS)上的重命名实用程序不同?关于两个不同的rename命令。

答案2

如果文件位于单身的没有子目录的文件夹,该文件夹名为photos

for pathname in photos/*(*).NEF; do
    newname=${pathname##*/}
    newname=${newname%% '('*}.NEF

    printf 'Would move "%s" to "%s"\n' "$pathname" "${pathname%/*}/$newname"
    # mv -i "$pathname" "${pathname%/*}/$newname"
done

这将迭代photos名称中包含 a(并以).NEF.通过从当前路径名中删除目录名,然后删除剩余内容中␣((空格和)之后的所有内容并添加到名称末尾来创建新文件名。(.NEF

为了安全起见,文件的实际重命名被注释掉。

上面代码的输出示例:

Would move "photos/DSC_0001 (2015_07_30 10_34_56 UTC).NEF" to "photos/DSC_0001.NEF"

如果文件位于较大目录结构中的某个位置:

find photos -type f -name '*(*).NEF' -exec sh -c '
    for pathname do
        newname=${pathname##*/}
        newname=${newname%% \(*}.NEF

        printf "Would move "%s" to "%s"\n" "$pathname" "${pathname%/*}/$newname"
        # mv -i "$pathname" "${pathname%/*}/$newname"
    done' sh {} +

这里唯一的区别是为循环生成相关文件的路径名的方式。在这种情况下,find将批量传递找到的路径名到循环,但循环本身与此答案的第一部分相同(对引用进行了一些细微修改)。

有关的:

答案3

(如果所有文件名中(而不是路径中)都有空格括号 ( ) 对,您可以使用:

mv "$f" "${f%% (*}.NEF"

要循环所有文件,请执行以下操作:

$ for f in dir/*\(*\).NEF; do [ -f "$f" ] && mv "$f" "${f%% (*}.NEF"; done

答案4

您必须位于文件所在的目录中

let a=0; for i in *.NEF; do let a=a+1; b=`basename $PWD`; c=`printf %04d$b.NEF $a`; mv $i $c; done

同时重命名所有内容。

相关内容