Я пытаюсь выполнить простую задачу с помощью превосходного сообщения здесь: Я хотел бы удалить все файлы из папки кроме перечисленных в .txt файле, содержавшемся в папке. Синтаксис хорошо работает, но по некоторым причинам все файлы удалены - в основном, в сценарии говорится, что нет никаких корреспонденций между именами файлов в папке и тех, которые в .txt файле - но я вижу, что существует!
Я думал, возможно, мог бы быть некоторый невидимый пробел после моих имен файлов, которые я не вижу (в папке или .txt файле). Но я не думаю так... Есть ли другое решение, о котором я не думаю?
Похоже, что ваш файл a.txt
содержит скрытые символы из-за того, что он, возможно, создавался или редактировался в других ОС, таких как Windows.
Сначала вам необходимо очистить файл чтобы использовать его без синтаксических ошибок.
Самый простой способ - использовать инструмент под названием dos2unix . Для этого выполните следующие действия:
Во-первых: Установите dos2unix
, открыв терминал и выполнив следующую команду:
sudo apt install dos2unix
Во-вторых: Создайте резервную копию a. txt
.
В-третьих: Используйте dos2unix
в своем файле, выполнив следующую команду в терминале из каталога, содержащего ваш файл a.txt
:
dos2unix a.txt
Наконец: Протестируйте свой файл. Теперь все должно быть в порядке.
Сценарий , о котором вы говорите, будет давать ложные срабатывания. для
буквально расширяет имена файлов,это означает, что специальные символы будут сохранены, и использование их в качестве шаблона нарушит сопоставление.
Пример:
#!/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
Лучшим подходом было бы сохранить экранирование оболочки.
#!/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'