我正在编写一个脚本来清理目录中的文本文件(我知道,这是一个坏主意,但我真的需要它),我写了这个:
#!/bin/bash
var=$(ls -p /direcotry/to/file | grep -v /)
truncate -s 0 $var
问题是,当我运行脚本时,该目录中的所有文件都会复制到我启动脚本的目录中,并且原始目录中的文件保持不变。为什么会出现这种行为以及如何解决它?
答案1
这是因为命令的输出ls
只是文件名列表,而不是它们的路径。因此,该truncate
命令将在当前目录中重新创建与空文件相同的文件名。
此外,即使正确完成,您的方法也会在稍微奇怪的文件名(例如包含空格的文件名)上中断,更不用说更复杂的文件名(带有换行符或反斜杠等)。
首先,您不需要编写脚本。您可以将文件列表传递给truncate
:
truncate -s 0 /direcotry/to/*
如果truncate
遇到目录,它只会打印错误并移至下一项:
truncate: cannot open ‘foo’ for writing: Is a directory
为了更干净地做到这一点,您可以使用find
:
find /direcotry/to/file -type f -exec truncate -s {} +
或者一个 shell glob:
for f in /direcotry/to/file; do
[ -f "$f" ] && truncate -s "$f"
done