ubuntu 如何删除具有特定扩展名的文件的扩展名?

7kjnsjlb  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(336)

我正在尝试创建一个程序,它可以删除目录中具有特定扩展名的文件的扩展名。
例如,存在一个目录d1,在该目录中有三个文件a.jpg,b.jpg和c.txt,我想要操作的扩展名是. jpg。
在调用我的程序之后,我的输出应该是a b c.txt,因为所有带有.jpg的文件现在都删除了jpg。
以下是我迄今为止解决这个问题的尝试:

#!/bin/bash
echo "Enter an extension"
read extension
echo "Enter a directory"
read directory
allfiles=$( ls -l $directory)
for x in $allfiles
do
        ext=$( echo $x | sed 's:.*.::')
        if [ $ext -eq $extension]
        then
                echo $( $x | cut -f 2 -d '.')
        else
                echo $x
        fi

done

但是,当我运行这个程序时,我得到一个错误消息

'-f' is not defined
'-f' is not defined

我应该在代码中更改什么?

um6iljoc

um6iljoc1#

可以通过将find的结果传输到while循环来解决问题:

# First step - basic idea:
# Note: requires hardening

find . -type f | while read file; do
    # do some work with ${file}
done

接下来,您可以解压缩一个不带扩展名${file%.*}的文件名,解压缩一个扩展名${file##*.}的文件名(请参见Bash - Shell参数扩展):

# Second step - work with file extension:
# Note: requires hardening

find . -type f | while read file; do
    [[ "${file##*.}" == "jpg" ]] && echo "${file%.*}" || echo "${file}";
done

最后一步是引入某种加固,文件名可能包含一些“奇怪”的字符,比如换行符或反斜杠,我们可以强制find打印文件名,后面跟一个空字符(而不是换行符),然后调优read来处理它:

# Final step

find . -type f -print0 | while IFS= read -r -d '' file; do
    [[ "${file##*.}" == "jpg" ]] && echo "${file%.*}" || echo "${file}";
done
7eumitmz

7eumitmz2#

使用mv命令怎么样?

mv a.jpg a

相关问题