我正在尝试从某个目录中删除所有文件中的特定单词列表,并将其替换为空。
所以:
这个真棒内容720p BLAH FOO BANG OOO - 30.9.2013.mp4
变为:
这个令人敬畏的内容 - 30.9.2013.mp4
现在,以下内容适用于单个查找并替换一个单词。
find path/to/folder/ -maxdepth 3 -name '*.*' -execdir bash -c 'mv -i "$1" "${1//foo/}"' bash {} \;
我也尝试过多次查找,但这似乎是一种很长的方式,我似乎遇到了这样的问题。
我有几个问题:
尝试在cronjob上将其作为bash脚本运行。
除非有更好的方法删除“This Awesome Content” - “30.9.2013.mp4”之间的所有内容。
非常感谢。
答案 0 :(得分:4)
您可以使用'echo'命令将文件名称作为变量访问。完成后,进行所需更改的最有效方法是使用“sed”。您可以使用'-e'标志将sed命令串在一起。作为bash中for循环的一部分,这一行为您提供了一个开始。您也可以使用这样的行作为“查找”语句的一部分。
echo $fyle | sed -e 's/FOO//gI' -e 's/BANG//gI'
获得所需的文件名后,可以将其移回原始名称。如果您需要更具体的说明,请与我们联系。
更新:这是一个更完整的解决方案。您必须将脚本调整为您自己的文件名等。
for fyle in $(find . -name "*.*")
do
mv -i $fyle `echo $fyle | sed -e 's/FOO//gI' -e 's/BANG//gI' `
done
最后,要用一个空格字符替换多个空白字符,可以添加另一个sed命令。这是一个工作命令:
echo "file input.txt" | sed 's/ */ /g'
答案 1 :(得分:3)
执行此操作的一种方法是添加一个中间步骤,使用mv
命令生成文件以实现此目的,然后执行该文件。我假设你有一个包含你不想要的单词的words_file
文件。
cd
到文件夹
# Create list of valid <file>s in file_list, and list of "mv <file> " commmands
# in cmd_file
ls | grep -f words_file | tee file_list | sed 's/\(.*\)/mv "\1" /g' > cmd_file
# Create the sed statements using the words_file, store it to sed_commands
# Then, apply the sed commands to file_list
sed 's/\(.*\)/s\/\1\/\/g/g' words_file > sed_commands
sed -f sed_commands file_list > new_file_names
# Combine cmd_file and new_file_names to produce the full mv statements
paste cmd_file new_file_names > final_cmds
# To verify the commands
cat final_cmds
# Finally, execute it
sh final_cmds
这是我能想到的,它避免为每个单词手动编写sed -e
。不确定使用常见的bash实用程序是否有更简单的方法。当然,您可以使用perl或python并更简洁地编写它。
修改:简化它,取消了eval和xargs。
答案 2 :(得分:1)
该任务的perl脚本。它至少接受两个参数,第一个是要从文件名中删除的单词列表,其余的是要处理的文件:
perl -MFile::Spec -MFile::Copy -e '
$words = join( q{|}, split( q| |, shift ) );
$words_re = qr{$words}i;
for $path ( @ARGV ) {
($dummy, $dir, $f) = File::Spec->splitpath( $path );
$f =~ s/$words_re//g;
$f =~ s/\s{2,}/ /g;
$newpath = File::Spec->catfile( $dir, $f );
move( $path, $newpath );
printf qq|[[%s]] renamed to [[%s]]\n|, $path, $newpath;
}
' "720p BLAH FOO BANG OOO" tmp/user/*.mp4
在我的测试中,我有以下输出:
[[tmp/user/This Awesome Content 720p BLAH FOO BANG OOO - 30.9.2013.mp4]] renamed to [[tmp/user/This Awesome Content - 30.9.2013.mp4]]
答案 3 :(得分:0)
prename
对文件重命名部分非常有用。类似的:
find ... -exec prename 's/(deleteme1|deleteme2|…)//g' {} \;