将 ls 输出分配给变量会产生意外行为

将 ls 输出分配给变量会产生意外行为

我正在编写一个脚本来清理目录中的文本文件(我知道,这是一个坏主意,但我真的需要它),我写了这个:

#!/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

相关内容