如何将文本写入每个空文件

如何将文本写入每个空文件

我可以使用以下方法在当前目录中找到空文件;

find . -empty -type f 

我想知道

  1. 我发现如何将文本写入空文件。
  2. 如果文件已包含文本,如何清空文件。

答案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

相关内容