bash копирование файлов по маске

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
safronowmax
Сообщения: 103

bash копирование файлов по маске

Сообщение safronowmax »

Здравствуйте, подскажите пж-та, только начинаю изучать bash и возник вопрос: написал простейший скрипт, который находит все файлы с расширением txt в каталоге /testmy. Если файлы найдены, то они копируются в каталог /testmy2. Если файлов с расширением txt нет, то выдается сообщение: файлов с расширением txt нет в каталоге и происходит выход из скрипта.
Так вот, скрипт корректно работает, если есть один файл с расширением txt. Если их 2 и более, то скрипт всегда возвращает "файлов с расширением txt нет в каталоге". В чем может быть проблема?
Сам скрипт:

#!/bin/bash
searcher=`find /testmy -name *.txt`
cd /testmy
if [[ ! -f $searcher ]]; then
echo "файлов с расширением txt нет в каталоге"
exit 0
else
cp $searcher /testmy2
echo "файлы с расширением txt скопированы"
fi
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: bash копирование файлов по маске

Сообщение Bizdelnick »

Если файлов несколько, переменная $searcher будет содержать имена их всех, разделённые символом новой строки. Вы проверяете, есть ли файл с именем, совпадающим с содержимым (всем) этой переменной, а такого, разумеется, нет. Вместо этого достаточно проверить статус выхода find: если файлы найдены, он будет 0, если нет — отличным от 0.
Ещё один нюанс: символ * надо экранировать, иначе он может будет проинтерпретирован башем как шаблон и, если в текущем каталоге есть файл (или файлы), соответствующий шаблону, выполнится подстановка. В результате find будет искать файл с именем, совпадающим с именем файла из текущего каталога (а если таких файлов подставится несколько, выдаст сообщение об ошибке).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
v1k3ng
Сообщения: 98
ОС: centos/ubuntu

Re: bash копирование файлов по маске

Сообщение v1k3ng »

user@host

#!/bin/bash searcher=`find /testmy -name *.txt` if [[ -z $searcher ]] then echo "файлов с расширением txt нет в каталоге" exit 0 else cp $searcher /testmy2 echo "файлы с расширением txt скопированы" fi


Не претендую на стопроцентную правильность и изящность, но так оно хотя бы работает.
Почему не работало у вас:
В переменную $searcher вы загоняли весь список файлов. Допустим, в директории было 3 файла с названиями 1.txt, 2.txt и 3.txt.
Тогда переменная $searcher перед условием выглядела бы "/testmy/1.txt /testmy/2.txt /testmy/3.txt" без кавычек. И вы спрашиваете в условии IF - а есть ли такой файл?? Разумеется такого файла нет. Когда у вас находился один файл, тогда и переменная выглядела как полный путь к файлу.
Я заменил в условии ! -f на -z (если длина строки нулевая, то...)
Спасибо сказали:
safronowmax
Сообщения: 103

Re: bash копирование файлов по маске

Сообщение safronowmax »

Спасибо за помощь!!!
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: bash копирование файлов по маске

Сообщение nerve »

скопирует если есть txt файлы или выдаст no files.

Shell

cp /testmy/*.txt /testmy2 2>/dev/null || echo "no files"

Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: bash копирование файлов по маске

Сообщение Vascom »

nerve писал(а):
17.10.2017 10:04
скопирует если есть txt файлы или выдаст no files.

Shell

cp /testmy/*.txt /testmy2 2>/dev/null || echo "no files"


Но так не будет искать в подкаталогах.
можно

Код: Выделить всё

find /testmy -type -f name "*.txt" -exec cp {} /testmy2/ \; || echo "no files"
Спасибо сказали:
Ответить