我正在尝试使用优秀的帖子完成一个简单的任务这里:我想删除文件夹中的所有文件,但文件夹中包含的 .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'