【问题标题】:Perl using the -i option on a vboxsf share: Can't remove input_file Text file busy, skipping filePerl 在 vboxsf 共享上使用 -i 选项:无法删除 input_file 文本文件繁忙,正在跳过文件
【发布时间】:2018-04-05 01:57:54
【问题描述】:

系统:Windows 10 主机上 VirtualBox 5.1.26 中的 Arch Linux

我尝试在终端中使用类似 sed 的 perl 来替换输入文件:

perl -i -p -e 's/orig/replace/g' input_file

但我总是得到:

Can't remove input_file Text file busy, skipping file

仅当文件位于 VirtualBox vboxsf 共享中时才会发生这种情况。使用所有其他工具(sed、mv、vim 或其他工具)更改文件没有问题。

这个问题似乎与:

我在谷歌上找不到任何解决方案:(

更新:

使用perl -i.bak -p -e 's/orig/replace/g' input_file 我收到类似的消息:

Can't rename input_file to input_file.bak: Text file busy, skipping file.

这与 gedit 显示的消息完全相同:

所以这是相同的行为,但谷歌搜索我只能找到 Gedit 主题。 perl -i 似乎没有人注意到这一点。

【问题讨论】:

  • 这不是 Perl 问题。
  • 没有值的 -i 选项在 Windows 文件系统上不起作用。该进程阻止自己删除原始输入文件。试试-i.bak 或类似的。

标签: perl sed virtualbox


【解决方案1】:

在运行 unix 操作系统时,您仍在使用 Windows 文件系统。 NTFS 不支持像 unix 文件系统这样的匿名文件,而 Perl -i 需要支持匿名文件。

解决方法是通过使用-i<ext>(例如-i~)而不是-i来使用临时文件。

【讨论】:

  • 对不起,也不起作用:$ perl -i.bak -p -e 's/orig/replace/g' input_file Can't rename input_file to input_file.bak: Text file busy, skipping file.
【解决方案2】:

我也有同样的问题。我的解决方案是一个 bashscript。将文件复制到 tmp。搜索和替换。用原始文件覆盖 tmp 文件。比删除 tmp-dir。如果您需要,您可以在脚本中使用参数进行动态搜索和替换,并创建一个别名以直接和随处调用脚本。

#!/bin/bash
echo "Removing text from .log files..."

echo "Creating tmp-dir..."
mkdir /tmp/myTmpFiles/

echo "Copy .log files to tmp..."
cp -v /home/user/sharedfolder/*.log /tmp/myTmpFiles/

echo "Search and Replace in tmp-files..."
perl -i -p0e 's/orig/replace/g' /tmp/myTmpFiles/*.log

echo "Copy .log to sharedfolder"
cp -v /tmp/myTmpFiles/*.log /home/user/sharedfolder/

echo "Remove tmp-dir..."
rm -vr /tmp/myTmpFiles/

echo "Done..."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2017-08-30
    • 2014-07-06
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多