我有一个包含.doc
文件和.pdf
文件的文件夹。其中一些具有相同的名称,例如test.doc
和test.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
,也可以处理列表以删除不需要的文件。
删除所有有 DOC 的 PDF 文件
for d in *.doc; do p="${d/%.doc/.pdf}"; test -f "$p" && rm -f "$p"; done
删除所有 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)