我可以使用以下方法在当前目录中找到空文件;
find . -empty -type f
我想知道
- 我发现如何将文本写入空文件。
- 如果文件已包含文本,如何清空文件。
答案1
正如您要求使用以下方法解决此问题xargs
:
find -empty | xargs -I files sh -c 'echo hello > $1' -- files
笔记
- 我们正在运行一个
sh
使用xargs
,同时每次传递一个文件名,它将被放置在而不是$1
,只是$1
我们传递给脚本的第一个参数。 - 使用
--
我告诉sh
命令在这里完成,最后我将文件名作为参数传递给sh
。
测试:
$ mkdir /tmp/lab && cd /tmp/lab
$ touch 1 2 3 && echo foo > 2
$ find -empty
./1
./3
$ find -empty | xargs -I files sh -c 'echo hello > $1' -- files
$ cat 1 2 3
hello
foo
hello
答案2
我相信这应该可行:
find . -empty -type f -exec bash -c "echo 'hello' > {}" \;
更新以查找空文件然后写入它们,同时查找非空文件并清空它们:
find . -type f \( -empty -o -size +0b \) -exec bash -c "if [[ ! -s '{}' ]]; then echo 'hello' > '{}'; else cp /dev/null '{}'; fi" \;
笔记:
这是从目标文件夹运行的,如果没有,那么只需将路径添加到命令中,如下所示:
find /path/to/folder ...
答案3
您还可以使用 shell 循环......
首先,为了使通配符递归以反映 的操作find
,请打开 globstar
shopt -s globstar
然后找到文件
for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "$f"; done
您将看到所有空文件。-s
条件test
表示文件长度大于 0 字节。使用! -s
您可以找到长度为零的文件。-f
检查文件是否为常规文件。
现在对写入文件的命令稍作调整:
for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "hello" > "$f"; done
你还说你想知道如果文件不为空,如何清空它们。清空文件的最简单方法是使用重定向截断它
> foo
清空任何内容(如果不存在foo
则创建空文件)。因此,要清空包含文本的文件foo
(请注意,这将破坏文件中的数据;确保您在正确的目录中运行此命令)您可以使用:
for f in **; do [[ -f "$f" ]] && if [[ -s "$f" ]] && > "$f"; done
您可以组合这两个命令,以写入空文件和包含文本的空文件:
for f in **; do [[ -f "$f" ]] && if [[ ! -s "$f" ]]; then echo "hello" > "$f"; else > "$f"; fi; done
或更易读(请先检查当前目录 - 这会破坏文件中的数据):
for f in **; do
[[ -f "$f" ]] && if
[[ ! -s "$f" ]]; then echo "hello" > "$f"
else > "$f"
fi
done
意思是“针对本目录及其子目录中的所有文件,测试文件是否为普通文件,如果是,则如果为空,则在其中写入“hello”,如果不为空,则将其清空”。
如果需要,您可以在完成后关闭 globstar(但是当您启动新的 shell 时它仍然会被取消设置,例如通过打开新终端、键入bash
或切换用户):
shopt -u globstar
答案4
我不太明白这个问题,你能说得更具体一些吗?如果你想在文件中写入一些文本/代码,Vim 确实很管用。
vim [File Path]
例如
vim /etc/hosts