循环遍历具有存储文件路径的文件并删除这些文件

时间:2021-03-22 21:31:47

标签: linux bash sh

我有一个 bash 脚本的问题,它应该遍历 ready.txt 文件中的每一行,该文件存储了文件的路径,然后对它们做一些事情,比如在这种情况下 rm -f

ready.txt 内容:

'/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf'
'/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI4.pdf'
'/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI6.pdf'

我的循环应该删除这些文件,但没有这样做。

while read -r line;
do
    rm -f $line
done < ready.txt

我手动测试过:

export line='/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf'

rm -f $line

或:

rm -f '/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf'

我测试的这两个都按预期工作,但循环不想要。

我是 bash 脚本的新手。我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

<块引用>

我错过了什么吗?

在此处发布之前使用 http://shellcheck.net 检查您的脚本。

假设输入文件包含:

/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI2.pdf
/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI4.pdf
/home/kamil/TEST/FOLDER ZE SPACJAMI/PLIK ZE SPACJAMI6.pdf

引用每个变量扩展以防止分词:

rm -f "$line"

很可能 rm -f $line 在您的 shell 中“有效”,因为您使用的是 zsh,而不是 bash,而在脚本中您使用的是 bash 或 sh。

还有 read -r line 将删除前导和尾随空格。使用:

while IFS= read -r line

有关更多信息,请研究分词、在 shell 中何时以及如何使用引号、双引号与单引号的区别。另见https://mywiki.wooledge.org/BashFAQ/001

要对文件的每一行执行一个命令,请使用 xargs,通常:

xargs -d '\n' rm < ready.txt

答案 1 :(得分:0)

它不起作用,因为文件名在您的输入文件 ready.txt 中包含单引号(除非实际文件名确实包含引号,我对此表示怀疑),因为 rm 找不到此类文件。< /p>

您需要删除它们:

while read -r line;
do
    rm -f "${line//\'}"
done < ready.txt

另见When to wrap quotes around a shell variable?

相关问题