Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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_Linux_Bash_Filenames - Fatal编程技术网

Regex 清理文件名的简单脚本

Regex 清理文件名的简单脚本,regex,linux,bash,filenames,Regex,Linux,Bash,Filenames,我有以下“问题”。我有一堆名为“ThisIsAFile BLAH.txt”的文件(比如数千个),我想清理这些文件名,以便它们只被称为“ThisIsAFile.txt”,删除“-”符号后面的所有内容,包括它 最好的方法是什么 提前感谢您的时间和帮助 附言。 操作系统是GNU/Linux。 第2页 我试图通过编写简单的脚本来教自己如何自动化琐碎的任务 解决方案: 谢谢各位。我终于明白了 rename 's/-[^-]*(?=\.\w+)$//' *.txt 再次感谢。检查man rename,查看

我有以下“问题”。我有一堆名为“ThisIsAFile BLAH.txt”的文件(比如数千个),我想清理这些文件名,以便它们只被称为“ThisIsAFile.txt”,删除“-”符号后面的所有内容,包括它

最好的方法是什么

提前感谢您的时间和帮助

附言。 操作系统是GNU/Linux。 第2页 我试图通过编写简单的脚本来教自己如何自动化琐碎的任务

解决方案:

谢谢各位。我终于明白了

rename 's/-[^-]*(?=\.\w+)$//' *.txt

再次感谢。

检查
man rename
,查看是否支持regex。如果是的话,像这样简单的事情就可以了

rename 's/-.*/.txt/' *.txt
它在所有.txt文件名中搜索破折号,并用.txt替换破折号及其后面的所有内容

s="ThisIsAFile-BLAH.txt"
纯BASH:

echo "${s/-*\./.}"
ThisIsAFile.txt
使用sed:

sed 's/-.*\./\./' <<< "$s"
ThisIsAFile.txt

sed的/-.*\./\./'通过使用awk,它可以写成

输入文件:

ThisIsAFile2-Blah.txt
ThisIsAFile3-Blah.txt
ThisIsAFile-Blah.txt
更改命令

ls *.txt|awk `s=$1` 'BEGIN{FS="-"; OFS=""} {print "mv "$s" "$1,".txt"}' |sh
同样的输出将是

 ThisIsAFile2.txt
 ThisIsAFile3.txt
 ThisIsAFile.txt

如果文件不太多,可以使用glob循环浏览文件:

for i in *-BLAH.txt; do
    mv -nv -- "$i" "${i%-BLAH.txt}.txt"
done
(注意使用
-n
以避免覆盖本来已经存在的文件,使用
-v
以避免冗长(可选),并使用
--
以防一个文件以连字符开头,以免混淆试图将其解释为选项的
mv
)。也不是引用

如果您有很多文件,可以使用
查找
,这可能比Bash的globbing更快:

find . -maxdepth 1 -name '*-BLAH.txt' -exec bash -c 'while(($#)); do mv -nv -- "$1" "${1%-BLAH.txt}"; shift; done' _ {} +
这里我使用find的
+
操作符,这样
bash
命令就不会产生太多次。然后bash对find给出的参数进行循环。注意伪参数
的使用
由于以这种方式启动,Bash将从0开始设置其位置参数,而不是从1开始

find方法非常好,因为您可以微调将应用bash循环的文件。在bash循环中,您可以生成任何您喜欢的重命名方案