我有超过 7k 个文件,其中一些是 HTML,一些是 PDF,如下所示:
我现在想使用终端将所有 PDF 移动到新目录。不幸的是,当我这么做的时候
mv *.pdf ../new_directory/
我得到“没有这样的文件或目录”,因为所有文件都没有任何文件扩展名(没有 .pdf 或 .HTML),但是当我对随机文件执行以下操作时:
file -b \[2022\]\ NZHC\ 1
它确实显示“PDF 文档”或“HTML 文档,ASCII 文本”,因此系统可以识别正确的格式。那么如何分别移动所有 pdf 或 HTML 呢?有没有办法在文件名中添加适当的扩展名(.pdf 或 .HTML)?
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
前面来测试它是否确实按预期工作,这样它实际上不会被执行,而只是打印出命令。
创建了一些 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