【问题标题】:How to catch files with same names but different extensions in Linux and delete them如何在Linux中捕获具有相同名称但扩展名不同的文件并删除它们
【发布时间】:2019-03-26 15:32:44
【问题描述】:

操作系统 - Ubuntu 16.04

我的目标很简单。一个文件夹中有多个图像说

A.jpg
A.jpeg
B.jpg
B.jpeg
C.jpg

我想要拥有 .jpeg 副本的 jpg 文件的名称。所以在这种情况下,我想要名称 A.jpg 和 B.jpg。请注意,我不想要 C.jpg,因为它没有 jpeg 副本。

接下来,我想删除我拥有的名称的 .jpg 文件。所以在这种情况下,我只想删除 A.jpg 和 B.jpg。

是否有一组命令可以做到这一点? (我缩进了文件名,因为出于某种原因,stackoverflow 告诉我这是代码。)

编辑

有没有办法可以将这些文件名放在一个 txt 文件中,然后从中读取以删除所需的文件?

【问题讨论】:

    标签: linux ubuntu terminal ubuntu-16.04


    【解决方案1】:

    你可以试试:

    for file in *.jpeg; do echo ${file%.*}.jpg; done
    

    如果这是你想要的,只需将 'echo' 替换为 'rm'

    (已编辑)这样您就不会看到不存在文件的错误:

    for file in *.jpeg; do [[ -f ${file%.*}.jpg ]] && rm ${file%.*}.jpg; done
    

    【讨论】:

    • 该命令成功地告诉我具有 jpeg 副本的文件的名称,但是当我将 echo 替换为 rm 时,它无法删除它们。它报告每个文件的错误 rm: cannot remove 'imagename' : No such file or directory
    • 你能告诉我输出吗?无论如何,对于那些没有 jpg 的 jpeg 文件,它会失败,请忽略这些错误。
    【解决方案2】:

    这可能是:

    #!/bin/sh
    
    JPG_LIST="*.jpg"
    #JPG_LIST=$(cat JPG_filenames_to_test.txt)
    
    for filename in $JPG_LIST; do
        BASENAME="${filename%.*}"
        echo -n "Basename '$BASENAME': "
        if [ -e $BASENAME.jpg -a -e $BASENAME.jpeg ] ; then
            echo "$BASENAME.jpeg found. Removing $BASENAME.jpg"
            rm $BASENAME.jpg
        else
            echo "No $BASENAME.jpeg file found. Keeping original $BASENAME.jpg"
        fi
    done
    

    【讨论】:

    • 我将它复制粘贴到文件夹中打开的终端中,它什么也没做,甚至没有打印名称
    • @TanmayBhatnagar 嗯...我已经在我的终端中测试了它并且它有效。要让脚本打印任何内容,您需要同时拥有 SAMENAME.jpg SAMENAME.jpeg.
    • 我有 SAMENAME.jpgSAMENAME.jpeg。我所做的是将其复制粘贴到 gedit 并将其保存为 image 文件夹中的 delete.sh ,然后运行命令 bash delete.sh 但它什么也没输出,什么也没做。
    • 此脚本假定文件的字面意思是 A.jpgB.jpg 等,但这种情况不太可能发生。 (除此之外,它正在删除每对的错误文件。)
    • @cHao 先生,您能帮我解决这个问题吗?我应该使用 1500 多张图片,这是其中的一部分
    猜你喜欢
    • 2021-11-15
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多