![如何将目录中的所有纯文本文件更改为 .txt 文件?有这样的命令吗?](https://linux22.com/image/1168641/%E5%A6%82%E4%BD%95%E5%B0%86%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%BA%AF%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E6%9B%B4%E6%94%B9%E4%B8%BA%20.txt%20%E6%96%87%E4%BB%B6%EF%BC%9F%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E5%91%BD%E4%BB%A4%E5%90%97%EF%BC%9F.png)
我已尝试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 {}