Невидимое пространство при попытке удалить файл (но исключить все файлы в списке)?

Я пытаюсь выполнить простую задачу с помощью превосходного сообщения здесь: Я хотел бы удалить все файлы из папки кроме перечисленных в .txt файле, содержавшемся в папке. Синтаксис хорошо работает, но по некоторым причинам все файлы удалены - в основном, в сценарии говорится, что нет никаких корреспонденций между именами файлов в папке и тех, которые в .txt файле - но я вижу, что существует!

Я думал, возможно, мог бы быть некоторый невидимый пробел после моих имен файлов, которые я не вижу (в папке или .txt файле). Но я не думаю так... Есть ли другое решение, о котором я не думаю?

1
задан 26 October 2019 в 00:56

2 ответа

Похоже, что ваш файл a.txt содержит скрытые символы из-за того, что он, возможно, создавался или редактировался в других ОС, таких как Windows.

Сначала вам необходимо очистить файл чтобы использовать его без синтаксических ошибок.

Самый простой способ - использовать инструмент под названием dos2unix . Для этого выполните следующие действия:


Во-первых: Установите dos2unix , открыв терминал и выполнив следующую команду:

sudo apt install dos2unix

Во-вторых: Создайте резервную копию a. txt .

В-третьих: Используйте dos2unix в своем файле, выполнив следующую команду в терминале из каталога, содержащего ваш файл a.txt :

dos2unix a.txt

Наконец: Протестируйте свой файл. Теперь все должно быть в порядке.

2
ответ дан 7 December 2019 в 13:14

Сценарий , о котором вы говорите, будет давать ложные срабатывания. для буквально расширяет имена файлов,это означает, что специальные символы будут сохранены, и использование их в качестве шаблона нарушит сопоставление.

Пример:

#!/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'

0
ответ дан 7 December 2019 в 13:14

Другие вопросы по тегам:

Похожие вопросы: