Здравствуйте, подскажите пж-та, только начинаю изучать 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
bash копирование файлов по маске
Модератор: Bizdelnick
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: bash копирование файлов по маске
Если файлов несколько, переменная $searcher будет содержать имена их всех, разделённые символом новой строки. Вы проверяете, есть ли файл с именем, совпадающим с содержимым (всем) этой переменной, а такого, разумеется, нет. Вместо этого достаточно проверить статус выхода find: если файлы найдены, он будет 0, если нет — отличным от 0.
Ещё один нюанс: символ * надо экранировать, иначе он может будет проинтерпретирован башем как шаблон и, если в текущем каталоге есть файл (или файлы), соответствующий шаблону, выполнится подстановка. В результате find будет искать файл с именем, совпадающим с именем файла из текущего каталога (а если таких файлов подставится несколько, выдаст сообщение об ошибке).
Ещё один нюанс: символ * надо экранировать, иначе он может будет проинтерпретирован башем как шаблон и, если в текущем каталоге есть файл (или файлы), соответствующий шаблону, выполнится подстановка. В результате find будет искать файл с именем, совпадающим с именем файла из текущего каталога (а если таких файлов подставится несколько, выдаст сообщение об ошибке).
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: bash копирование файлов по маске
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 (если длина строки нулевая, то...)
-
- Сообщения: 103
Re: bash копирование файлов по маске
Спасибо за помощь!!!
Re: bash копирование файлов по маске
скопирует если есть txt файлы или выдаст no files.
Shell
cp /testmy/*.txt /testmy2 2>/dev/null || echo "no files"
Спасибо сказали:
Re: bash копирование файлов по маске
Но так не будет искать в подкаталогах.
можно
Код: Выделить всё
find /testmy -type -f name "*.txt" -exec cp {} /testmy2/ \; || echo "no files"
Спасибо сказали: