如何对具有相同名称但不同扩展名的文件列表进行排序

如何对具有相同名称但不同扩展名的文件列表进行排序

我有一个包含.doc文件和.pdf文件的文件夹。其中一些具有相同的名称,例如test.doctest.pdf。我希望对文件夹进行排序以仅保留版本.doc(如果实际上存在重复项),因为.pdf不再需要版本

答案1

mkdir -p PDF
for f in *.pdf ; do
    bn=$(basename -- "$f" .pdf)
    [ -e "$bn.doc" ] && mv -- "$f" PDF/
done

我将由您决定rm -rf PDF/- 我喜欢在任何潜在风险的程序中尽可能晚地留下不可撤销的步骤。

如果您想直接删除它们,那么:

for f in *.pdf ; do
    [ -e "$(basename -- "$f" .pdf).doc" ] && rm -f -- "$f"
done

这个版本不需要设置中间变量“$bn” - 无论哪种方式都有效......在我看来,前者更“可读”,并且如果您对文件的基本名称有任何其他用途,也更好。

答案2

尝试

for i in `ls | awk '{print $1}' | cut -d'.' -f1 | uniq -d`
do
   rm -r $PWD/$i".pdf"
done

警告:您的文件名应仅包含一个点(.)(即)finename.extension,并且如果您执行相同的代码片段,则应在同一目录中执行。

答案3

通过“排序”文件夹来删除文件是没有意义的。您可以按文件名排序ls -bU | sort,也可以处理列表以删除不需要的文件。

  1. 删除所有有 DOC 的 PDF 文件

    for d in *.doc; do p="${d/%.doc/.pdf}"; test -f "$p" && rm -f "$p"; done
    
  2. 删除所有 PDF 文件

    rm -f *.pdf
    

这两种变体都处理带有空格和其他奇怪字符的文件名。您可以通过替换rm来测试解决方案echo rm

答案4

zsh

doc_base=(*.doc(:r)) && rm -f -- $^doc_base.pdf

或者:

setopt histsubstpattern # could go in ~/.zshrc
rm -f -- *.doc(:s/%doc/pdf)

要删除所有 pdf 文件,前提是有一个具有相同基本名称但扩展名不同(doc 或其他)的文件:

setopt histsubstpattern extendedglob
rm -f -- *.*~*.pdf(:r:s/%/pdf)

相关内容