【问题标题】:Using bash, how can I remove the extensions of all files in a specific directory?使用 bash,如何删除特定目录中所有文件的扩展名?
【发布时间】:2017-10-05 13:08:10
【问题描述】:

我想保留文件但删除它们的扩展名。这些文件的扩展名不同。我的最终目标是删除他们的所有扩展并将它们更改为我选择的一个扩展。我有第二部分。

到目前为止我的代码:

#!/bin/bash
echo -n "Enter the directory: "
read path
            #Remove all extensions
find $path -type f -exec mv '{}' '{}'.extension \; #add desired extension

【问题讨论】:

    标签: linux bash shell sh


    【解决方案1】:

    您不需要外部命令 find 来执行此操作,但只需在 bash 中执行即可。下面的脚本会从文件夹 path 中的所有文件中删除扩展名。

    for file in "$path"/*; do
        [ -f "$file" ] || continue
        mv "$file" "${file%.*}"
    done
    

    使用[ -f "$file" ] 的原因只是为了安全检查。 glob 表达式 "$path"/* 可能最终没有列出任何文件,在这种情况下,mv 命令将失败,因为没有文件。 [ -f "$file" ] || continue 条件通过在$file 变量为空时退出循环来保护这一点,其中[ -f "$file" ] 返回失败错误代码。 || 在复合语句中使用时,如果前一个命令失败,则将运行,因此,当接下来命中 continue 时,for 循环将终止。

    如果你想添加一个新的扩展,就这样做

    mv "$file" "${file%.*}.extension"
    

    【讨论】:

    • "[ -f "$file" ] || continue" 是否检查它是否是一个文件?
    • @Jaspreet:这是一种列出当前文件夹中所有文件的全局模式。你可能想通读Bash - Glob Patterns
    • for file in * ; do [ -f "$file" ] && { echo "${file%.*}"; } ; done -- 在重命名所有文件之前测试脚本 :)
    • 根据我之前的评论,多余的 OR 条件 || continue 可以替换为更简单的 AND && { }
    【解决方案2】:

    这也是一种方式

    for i in `find . -type f `;do  filename=`ls $i | cut -f 2 -d "."`;  mv $i ./$filename.ext; done
    

    【讨论】:

      【解决方案3】:

      您可能想尝试以下方法。它使用 find 和 awk 和 system() 来删除扩展:

      find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}'
      

      示例:

      [root@puppet:0 check]# ls -lrt
      total 0
      -rw-r--r--. 1 root root 0 Oct  5 13:49 abc.ext
      -rw-r--r--. 1 root root 0 Oct  5 13:49 something.gz
      [root@puppet:0 check]# find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}'
      [root@puppet:0 check]# ls -lrt
      total 0
      -rw-r--r--. 1 root root 0 Oct  5 13:49 abc
      -rw-r--r--. 1 root root 0 Oct  5 13:49 something
      

      另外,如果您有特定的扩展名要添加到所有文件中,您可以修改命令如下:

      find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS=".";ext=".png"}{system("mv "$0" ./"$1ext"")}'
      

      【讨论】:

        猜你喜欢
        • 2023-01-23
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多