尝试删除文件时是否存在不可见空间(但排除列表中的所有文件)?

尝试删除文件时是否存在不可见空间(但排除列表中的所有文件)?

我正在尝试使用优秀的帖子完成一个简单的任务这里:我想删除文件夹中的所有文件,但文件夹中包含的 .txt 文件中列出的文件除外。语法工作正常,但由于某种原因,所有文件都被删除 - 基本上脚本表示文件夹中的文件名与 .txt 文件中的文件名之间没有对应关系 - 但我可以看到有!

我以为我的文件名后面可能有一些看不见的空白(在文件夹或 .txt 文件中)。但我不这么认为...还有其他我没有想到的解决方案吗?

答案1

您的文件似乎a.txt包含隐藏字符,因为它可能是在其他操作系统(如 Windows)上创建或编辑的。

您需要先清理该文件才能使用它而不会出现语法错误。

最简单的方法是使用一个名为dos2unix。请按照以下步骤操作:


首先:dos2unix通过打开终端并运行以下命令进行安装:

sudo apt install dos2unix

第二:备份您的a.txt文件。

第三:dos2unix通过在包含文件的目录中的终端中运行以下命令来使用您的文件a.txt

dos2unix a.txt

最后:测试你的文件。现在应该没问题了。

答案2

脚本您所指的会产生误报。for将会逐字扩展文件名,这意味着特殊字符将被保留,并且使用它作为模式将会破坏匹配。

例子:

#!/bin/bash

# the script is adapted and slightly shortened.
shopt -s nullglob
for i in a* b*; do
   grep -Fx -e "$i" exclude.txt
done

输出:

$ ls
a   'a'$'\n''b'   b   exclude.txt
$ cat exclude.txt
a
b

$ script.sh
a
a
b
b

更好的方法是保留 shell-escape。

#!/bin/bash

shopt -s extglob

eval "list=( \
    $(ls --quoting-style=shell-escape !(exclude.txt) | \
        grep -vFx -f exclude.txt))"

for i in "${list[@]}"; do ls "$i"; done

例子:

$ cat exclude.txt  
'a'$'\n''b'

$ script.sh
a
b
$ cat exclude.txt  
a
b

$ script.sh
'a'$'\n''b'

相关内容