linux 如何添加缺少的文件扩展名或移动没有扩展名的文件

问题描述 投票:0回答:2

我有超过 7k 个文件,其中一些是 HTML,一些是 PDF,如下所示:

mixture of HTML and PDFs

我现在想使用终端将所有 PDF 移动到新目录。不幸的是,当我这么做的时候

mv *.pdf ../new_directory/

我得到“没有这样的文件或目录”,因为所有文件都没有任何文件扩展名(没有 .pdf 或 .HTML),但是当我对随机文件执行以下操作时:

file -b \[2022\]\ NZHC\ 1

它确实显示“PDF 文档”或“HTML 文档,ASCII 文本”,因此系统可以识别正确的格式。那么如何分别移动所有 pdf 或 HTML 呢?有没有办法在文件名中添加适当的扩展名(.pdf 或 .HTML)?

linux terminal file-extension mv
2个回答
2
投票

file -b --extension [filename]
为您提供给定文件的确定扩展名。

例如:

file -b --extension random_pdf.pdf # prints 'pdf'

但是,HTML 文件没有任何可识别的文件签名,因为它只是一个文本文件,因此该命令会返回

???

file -b --extension random_html.html # prints '???' because the type is unknown

不仅是 HTML,

file
也会向每个无法确定它是什么的文件返回
???

但是,假设您的文件夹中只有 PDF 和 HTML 文件,我们还可以假设该命令用

???
报告的每个文件都是 HTML 文件。

所以我们将使用

sed
???
更改为
html
,如下所示:

file -b --extension "$filename" | sed 's/???/html/'

现在,假设您仅对 PDF 和 HTML 文件使用此行,这将报告每个文件的正确文件扩展名。

使用命令替换,我们可以创建一个包含扩展名的新文件名。

echo "$filename.$(file -b --extension "$filename" | sed 's/???/html/')"

将其与

mv
和 bash for 循环相结合,我们可以得到这一行:

for i in *; do
    mv "$i" "$i.$(file -b --extension "$i" | sed 's/???/html/')"
done

瞧,文件夹中的所有文件现在都应该使用正确的扩展名进行重命名!

附注在运行命令之前,您应该通过将

echo
放在
mv
前面来测试它是否确实按预期工作,这样它实际上不会被执行,而只是打印出命令。


0
投票

创建了一些 bash 脚本,用于向缺少扩展名的文件添加扩展名。 基于提供的 answer 的代码,但使用一些附加方法可以对响应为

???
的文件进行有根据的猜测。

这些是脚本的重要部分:


# First try to guess the extension using `file --extension`
extension=$(file -b --extension "$file" | awk -F'/' '{print $1}')

# If the extension is "???" or similar (invalid), try the second method
if [[ "$extension" == "???" || -z "$extension" ]]; then
    # Guess the file type description using `file`
    file_type=$(file -b "$file")
    # Use the function to get a better extension based on the description
    extension=$(get_extension_by_description "$file_type")
fi


# Function to map file descriptions to appropriate extensions
get_extension_by_description() {
    local file_type="$1"

    case "$file_type" in
        *PDF*) echo "pdf" ;;
        *EPUB*) echo "epub" ;;
        *HTML*) echo "html" ;;
        *ASCII*) echo "txt" ;;
        *Zip*) echo "zip" ;;
        *RAR*) echo "rar" ;;
        *JPEG*) echo "jpg" ;;
        *PNG*) echo "png" ;;
        *DjVu*) echo "djvu" ;;
        *Mobipocket\ E-book*) echo "mobi" ;;
        *Microsoft\ Word*) echo "docx" ;;
        *OpenDocument\ Text*) echo "odt" ;;
        *Microsoft\ Excel*) echo "xlsx" ;;
        *OpenDocument\ Spreadsheet*) echo "ods" ;;
        *MP3*) echo "mp3" ;;
        *MPEG*) echo "mpg" ;;
        *Matroska*) echo "mkv" ;;
        *Video*) echo "mp4" ;;
        *Audio*) echo "wav" ;;
        *) echo "unknown" ;;
    esac
}

完整脚本可以在这里找到: https://gist.github.com/Aldo-f/eefbc893dd7f2403953e7cd01e3c8848

© www.soinside.com 2019 - 2024. All rights reserved.