Linux 从文件名中删除单词列表

Linux 从文件名中删除单词列表,linux,bash,unix,find,mv,perl,Linux,Bash,Unix,Find,Mv,Perl,我试图从我的所有文件中删除一个特定的单词列表,并将其替换为空 因此: 这篇精彩的内容720p废话-30.9.2013.mp4 变成: 这篇精彩的文章-30.9.2013.mp4 现在,以下内容非常适用于单个查找和替换一个单词 find path/to/folder/ -maxdepth 3 -name '*.*' -execdir bash -c 'mv -i "$1" "${1//foo/}"' bash {} \; 我也尝试了多次发现,但这似乎是一个非常漫长的过程,我似乎遇到了这样的问题

我试图从我的所有文件中删除一个特定的单词列表,并将其替换为空

因此:

这篇精彩的内容720p废话-30.9.2013.mp4

变成:

这篇精彩的文章-30.9.2013.mp4

现在,以下内容非常适用于单个查找和替换一个单词

find path/to/folder/ -maxdepth 3 -name '*.*' -execdir bash -c 'mv -i "$1" "${1//foo/}"' bash {} \;
我也尝试了多次发现,但这似乎是一个非常漫长的过程,我似乎遇到了这样的问题

我有几个问题:

  • 希望它不区分大小写吗
  • 需要“${1//foo/}”来引用列表
  • 如果大于1,请删除空白
试图在cronjob上以bash脚本的形式运行它

除非有更好的方法来删除“这个很棒的内容”-“30.9.2013.mp4”之间的所有内容


非常感谢。

您可以使用“echo”命令作为变量访问文件名。完成后,进行所需更改的最有效方法是使用“sed”。您可以使用“-e”标志将sed命令串在一起。作为bash中for循环的一部分,这一行为您提供了一个开始。您也可以在“find”语句中使用这样的行

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'

一种方法是添加一个中间步骤,使用
mv
命令生成一个文件,然后执行该文件。我假设您有一个
words\u文件
文件,其中包含您不想要的单词

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
#创建文件列表中的有效命令列表和“mv”命令列表
#在cmd_文件中
ls|grep-f words|u file|tee file|u list|sed的/\(.*)/mv“\1”/g'>cmd|u file
#使用words_file创建sed语句,并将其存储到sed_命令中
#然后,将sed命令应用于文件列表
sed的/\(.*)/s\/\1\/\/g/g'words\u file>sed\u命令
sed-f sed_命令文件列表>新文件名
#组合cmd_文件和new_文件名以生成完整的mv语句
粘贴cmd\u文件新建\u文件\u名称>最终\u cmds
#验证命令的步骤
cat final_cmds
#最后,执行它
sh最终课程cmds
这就是我能想到的,它避免了为每个单词手动编写
sed-e
。不确定是否有更简单的方法使用公共bash实用程序。当然,您可以使用perl或python并更简洁地编写它

编辑:简化了它,去掉了eval和xargs。

任务脚本。它至少接受两个参数,第一个是要从文件名中删除的单词列表,其余是要处理的文件:

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]]

prename
可用于文件重命名部件。stg类似:

find ... -exec prename 's/(deleteme1|deleteme2|…)//g' {} \;

看来我是个十足的新手。如何在find命令中实现这一点,替换mv命令?另外,如果我将i添加到-e's/FOO//g'e.g.-e's/FOO//Ig'中,这将忽略大小写敏感度。要使sed不区分大小写,请在末尾添加一个gI。我更新了我的帖子。我添加了一个更完整的解决方案。请让我知道它是如何为您工作的。看起来不错,如何指定文件夹?我在运行此“$sed's/(.*)/s\/\1\/\/g'words\u file>sed\u commands”时出错------错误是:sed:-e expression\1,字符19:未终止的's'command@Keelan开始之前,请将cd放入目录。@Hari Shankar是递归的吗?@Keelan否,但可以通过将
ls
更改为
find来实现递归。
在第一行中,我根本不懂perl,所以我想这可能超出了我的范围。我可以指定一个目录来搜索文件吗?@Keelan:可以。但是使用替代命令是危险的,因为它可以修改部分路径。使用一个模块需要一个修复程序。我在操作符期望的地方找到了一堆编译错误和字符串。我猜在复制和粘贴时,格式很可能是错误的。@Keelan:你对脚本的论点是什么?你逐字逐句地说,虽然我改变了路径,但你所写的是什么。