Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将预先指定的年份批量移动到文件名的末尾?_Regex_Bash_Shell_Unix_Rename - Fatal编程技术网

Regex 如何将预先指定的年份批量移动到文件名的末尾?

Regex 如何将预先指定的年份批量移动到文件名的末尾?,regex,bash,shell,unix,rename,Regex,Bash,Shell,Unix,Rename,我有一个文件列表(数千个),如下所示: /path/2010 - filename.txt /path/2011 - another file name.txt /path/filename (2010).txt /path/another file name (2011).txt 始终遵循此模式:####-string.txt 我需要把它们改成这样: /path/2010 - filename.txt /path/2011 - another file name.txt /path/fi

我有一个文件列表(数千个),如下所示:

/path/2010 - filename.txt
/path/2011 - another file name.txt
/path/filename (2010).txt
/path/another file name (2011).txt
始终遵循此模式:
####-string.txt

我需要把它们改成这样:

/path/2010 - filename.txt
/path/2011 - another file name.txt
/path/filename (2010).txt
/path/another file name (2011).txt
如何使用bash、shell、terminal等快速执行此操作?

Try命令:


-n
(-no-act)选项用于预览。
删除
-n
以执行替换。

未测试

find /path -name '???? - *.txt' -print0 | while read -d ''; do
    [[ $REPLY =~ (.*)/(....)\ -\ (.*)\.txt$ ]] || continue

    path=${BASH_REMATCH[1]}
    year=${BASH_REMATCH[2]}
    str=${BASH_REMATCH[3]}
    echo mv "$REPLY" "$path/$str ($year).txt"
done

一旦生成的
mv
命令看起来正确,请删除
echo

我更愿意将其作为注释添加,但目前还不允许添加

我问了一个类似的问题,并在这里得到了许多有用的答案:


也许其中一种解决方案可以根据您的需要进行调整。

我知道您没有用
zsh
标记它,但您确实说了
shell
。总之,下面介绍了如何使用
zsh
中的
zmv
函数:

autoload zmv                      # It's not loaded by default
zmv -nvw '* - *.*' '$2 ($1).$3'
如果您对输出满意,请删除
-n


-v
使
zmv
冗长
-w
隐式生成一组通配符。

拍摄,我的Mac没有重命名(
-bash:rename:command not found
)。我可以用
mv
来实现这一点吗?如果
*.txt
为一个命令行扩展了太多文件,
find/path-name'*.txt'-print0 | xargs-0 rename-n…
rename
是一个很小的perl脚本。我想你可以在MAC中安装它。Love rename,特别是
-n
部分我如何添加斜杠来转义路径和文件名中的空格?(*)应该贪婪地匹配所有内容,直到最后的斜杠、空格和全部。“\”转义文件名中的空格是否正确。我认为空间不应该有任何其他的问题。哦,没有景观的空间只出现在echo中。Mv工作得很好。谢谢给你“答案”,因为它在没有其他库的情况下工作。再次感谢。