Как проверить, существует ли несколько файлов?

Кажется, в вашей команде sed есть случайная косая черта в начале:

sed "/s/'//g"

должно быть:

sed "s/'//g"

Если вам нужно несколько выражений, просто используйте -e для них обоих (здесь я предполагаю вместе с Гленном Джекманом, что вы хотите ' вместо только & apos ):

sed -e "s/'//g" -e "s/'//g" filename
5
04.11.2016, 20:52
2 ответа

Вы можете использовать произвольную команду, например ls , чтобы проверить файлы и удалить их в одной строке

ls /tmp/bbsnode{1,2,3,4} &>/dev/null && rm /tmp/bbsnode{1,2,3,4}

Обратите внимание, что в целом небезопасно делать такие вещи в / tmp, потому что любой другой пользователь может создать конфликтующие файлы с одинаковыми именами.

Краткое объяснение:

Возвращаемое значение ls не равно нулю, если один из файлов не существует. {1,2,3,4} - это расширение скобок: оно расширяется до строки для каждого числа: поэтому / tmp / bbsnode {1,2,3,4} является то же, что и / tmp / bbsnode1 / tmp / bbsnode2 / tmp / bbsnode3 / tmp / bbsnode4 . && выполняет следующую команду, только если предыдущая команда имеет нулевое возвращаемое значение, и поэтому здесь rm выполняется, только если все 4 файла существуют. Наконец, &> / dev / null подавляет вывод ls ( &> перенаправляет как stdout , так и stderr , / dev / null избавляется от него).

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

set -- /tmp/bbsnode{1,2,3,4}
(for f; do test -f "$f" || exit; done) && rm -- "$@"
8
27.01.2020, 20:31

В этом конкретном случае вы можете сделать:

set -- file[1-4]
[[ $# -eq 4 ]] && rm -f -- "$@"

Этот устанавливает список аргументов для имен файлов, которые соответствуют любому из file1 , file2 , file3 или file4 1 , затем rm с этими файлами, только если количество аргументов равно 4, то есть, если все файлы существуют.


1: для простоты я использую файл вместо / tmp / bbsnode

3
27.01.2020, 20:31

Теги

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