rm 按模式匹配文件名

rm 按模式匹配文件名

我有 42000 多本 Project Gutenberg epub。通常一个版本既有图片版本,也有无图片版本。如果有图片副本,我想删除无图片副本。

...
pg16045-图像.epub
pg16045.epub
pg506.epub
...

在这种情况下,我想要删除 pg16045.epub,因为 pg16045-images.epub 存在,但不删除 pg506.epub,因为 pg506-images.epub 不存在。

我如何从命令行执行此操作?我正在使用 TCSH shell,但如果需要,我可以切换到 BASH。

答案1

如果确实有相应的文件,这将递归删除所有epub文件。/somewhere-images

find /somewhere -name '*-images.epub' -exec bash -c '
    f="${0//-images/}"
    [[ -f "$f" ]] && echo rm -- "$f"
' {} \;

echo当您确定它正确时,请删除。

答案2

这将找到你所有的'-images.epub',然后尝试删除相应的'.epub' 目录,而不检查它是否存在。

#!/bin/sh   

for d in *-images.epub ; do
  rmname=`echo "$d" | sed -e 's/\(.*\)-images\(\.epub\)/\1\2/'`
  echo rm "$rmname"
done

# end of file.

从行首删除“echo”即可使其真正起作用。在执行此类操作之前,最好先将命令回显到终端,看看这是否是您真正想要的。

答案3

这也许稍微短一点:

 find /path/to/target/directory -name '*images.epub' -exec sh -c ' echo '{}' | sed 's/-images//' | xargs  echo rm -f  ' \;

答案4

这应该够了吧

DIR="/home/xyzuser/testdir"
对于我在 $(ls "$DIR");
  如果 [[ "$i" == *.images.epub ]]
  然后
    变量=${i%.*}
    变量=${变量%.*}
    如果[[-f“$ DIR / $ var.epub”]]
    然后
      rm "$DIR/$var.epub"
完毕

只需将 DIR 值更改为文件所在的位置即可。如果您将此脚本存储在文件中,请不要忘记使用以下命令使其可执行:

chmod +x 文件名.sh
。否则,您将无法运行它。它所做的基本上就是。

  1. 循环遍历所有文件(名称)
  2. 如果文件包含“images.pub”,则会从文件名中删除“.images.epub”部分
  3. 然后检查是否有任何带有“.epub”后缀(结尾部分)的文件具有当前“.images.epub”文件的前缀(开头部分)。如果找到,则将其删除。

相关内容