如何将目录中的所有纯文本文件更改为 .txt 文件?有这样的命令吗?

如何将目录中的所有纯文本文件更改为 .txt 文件?有这样的命令吗?

我已尝试rename命令,但没有成功。

答案1

假设你的目录已满仅有的使用简单的文本文件最直接的方式给出全部文件和扩展名的 .txt 的方法是在该目录中打开终端窗口并运行以下命令:

for f in *; do mv "$f" "$f.txt"; done

你一定会喜欢命令行:)

答案2

您可以尝试使用

file -i NameofFileGoesHere

命令。

文件手册页

看看你是否发现了一个模式示例输出:

file.mp4: application/octet-stream; charset=binary                                                       
filenumplayer1: inode/x-empty; charset=binary                                                          
foobar.ogg: application/octet-stream; charset=binary 

对于某些文件,它返回:

headstart.save: text/x-shellscript; charset=us-ascii

您正在寻找标有“ascii”的文件,但它们实际上可能是任何类型的文件。特别是如果它不是您创建的文件。重命名它不是一个好主意。

但如果所有文件确实都是个人文件。根据以上信息,我会尝试以下脚本

#!/bin/bash
for f in * 
do
#Looking for the string us-ascii hence this command
whatis=$(file --mime "$f" | awk -F "=" '{print $2}')
if [[ $whatis == "us-ascii" ]]
then
mv "$f" "$f.txt"
fi
done

这只是为了回答问题!

答案3

有两种方法可以做到这一点。

第一的安全的方法将创建带有 txt 扩展名的文件的副本并保留原始文件:

IFS=$'\n'; for i in $(file * | grep text | grep -v "\.txt\|exec" | sed 's/\:.*$//g'); do cp -- "$i" "$i".txt; done

或者,以下方法将不会保留原始文件:

IFS=$'\n'; for i in $(file * | grep text | grep -v "\.txt\|exec" | sed 's/\:.*$//g'); do mv -- "$i" "$i".txt; done

这两种方法都使用file命令来确定哪些文件是 ASCII 文本文件。然后,grep过滤结果以仅包含“文本”文件。接下来,grep -v "\.txt\|exec"排除已经包含“.txt”文件扩展名和 shell 脚本可执行文件的文件并sed隔离文件名,以便为我们提供干净的文件列表。

第一种方法是使用cp命令创建复制每个文件的扩展名为“.txt”。

第二种方法是使用mv命令移动将每个文件名改为带有“.txt”扩展名的新名称。

我还用了输入字段分隔符在循环开始时包含带有空格的文件。

此外,如果文件名包含换行符或冒号,它将无法正常工作。

答案4

如果当前目录中的所有文本文件.txt尚未具有该扩展名,这将移动到。
您可以更改或删除-maxdepth 1以使其递归。

find . -maxdepth 1 -type f \
  -exec grep -Iq . {} \; \
  -exec sh -c '
      test "$1" != "${1%.txt}.txt" \
      && mv -i -- "$1" "${1%.txt}.txt"
  ' find-sh {} \;

grep -Iq . {}find跳过二进制文件(通过)。
你实际上并不需要那test部分,但是这样mv会抛出一个错误消息。


如果你想要的话递归

grep -rIlZ . . \
| xargs -0 -I{} sh -c '
      test "$1" != "${1%.txt}.txt" \
      && mv -i -- "$1" "${1%.txt}.txt"
  ' xargs-sh {}

相关内容