если вы хотите найти все имена abc в файле :$ grep -R abc./Направление
или если вы хотите найти файл, который содержит abc :$ лс -1 | grep abc или $ ls abc ./Направление
Проблема с вашим подходом в два -раза:
Вы используете подстановочные символы (, также известные как «подстановочные знаки» )в вызове grep
, хотя grep
ожидает регулярное выражение. Эти два различны . В globs *
означает «строку любых символов и любой длины», тогда как в регулярных выражениях это означает «ноль или более предшествующих символов» или литерал *
, если предшествующего символа нет. И наоборот, .
в глобусе означает литерал .
, тогда как в регулярном выражении это означает «любой одиночный символ». Таким образом, ваш grep
будет искать файлы, которые буквально содержат звездочку, затем любой одиночный символ, затем my_custom
и снова любой одиночный символ. Для соответствия, которого вы хотите достичь, регулярное выражение будет
.*\.my_custom\.
или, поскольку вы его не привязывали, просто
\.my_custom\.
Вы хотите использовать сгенерированный список в сценарии оболочки для дальнейшей обработки.Как уже заметил @Panki, вы никогда не должны анализировать выводls
для этой цели, так как он наткнется на имена файлов со специальными символами. К счастью, вы можете вернуться к своей первоначальной попытке с globs и перебрать файлы прямо в оболочке :
for file in *.my_custom.*
do
your_upload_command "$file"
done
Обратите внимание, что переменная оболочки $file
заключена в двойные кавычки. Это делается для того, чтобы не происходило нежелательного разделения слов -, т. е. ваш сценарий оболочки не наткнулся на пробел или любой другой специальный символ в имени файла.
Поскольку вы заявили, что хотите сделать это рекурсивно, этого можно добиться с помощью незначительного изменения сценария оболочки, используя globstar
параметр оболочки , доступный, начиная с Bash v4:
shopt -s globstar
for file in **/*.my_custom.*
do
your_upload_command "$file"
done
Я бы сделал (в системах GNU):
(cd my_directory && find. -name '*.my_custom.*' -type f -print0) |
tar --null -T - -cf - | gzip -1 | ssh host 'cd my_directory && tar zxf -'
Это можно сделать с помощью find
.
find my_directory -name "*.my_custom." -type f -exec scp -i {} <username>@<host>:<path>/{} \;
{}
будет содержать путь к соответствующему файлу, начиная с моего каталога _. exec
указывает команду, которая будет выполняться для каждого совпадения. Вы можете изменить свой путь scp
, помня об этих двух моментах.