Получение списка файлов по шаблону в директории и всех вложенных и перебор результата

если вы хотите найти все имена abc в файле :$ grep -R abc./Направление

или если вы хотите найти файл, который содержит abc :$ лс -1 | grep abc или $ ls abc ./Направление

0
05.10.2020, 12:05
3 ответа

Проблема с вашим подходом в два -раза:

  1. Вы используете подстановочные символы (, также известные как «подстановочные знаки» )в вызове grep, хотя grepожидает регулярное выражение. Эти два различны . В globs *означает «строку любых символов и любой длины», тогда как в регулярных выражениях это означает «ноль или более предшествующих символов» или литерал *, если предшествующего символа нет. И наоборот, .в глобусе означает литерал ., тогда как в регулярном выражении это означает «любой одиночный символ». Таким образом, ваш grepбудет искать файлы, которые буквально содержат звездочку, затем любой одиночный символ, затем my_customи снова любой одиночный символ. Для соответствия, которого вы хотите достичь, регулярное выражение будет

    .*\.my_custom\.
    

    или, поскольку вы его не привязывали, просто

    \.my_custom\.
    
  2. Вы хотите использовать сгенерированный список в сценарии оболочки для дальнейшей обработки.Как уже заметил @Panki, вы никогда не должны анализировать выводlsдля этой цели, так как он наткнется на имена файлов со специальными символами. К счастью, вы можете вернуться к своей первоначальной попытке с globs и перебрать файлы прямо в оболочке :

    .
    for file in *.my_custom.*
    do
      your_upload_command "$file"
    done
    

    Обратите внимание, что переменная оболочки $fileзаключена в двойные кавычки. Это делается для того, чтобы не происходило нежелательного разделения слов -, т. е. ваш сценарий оболочки не наткнулся на пробел или любой другой специальный символ в имени файла.

  3. Поскольку вы заявили, что хотите сделать это рекурсивно, этого можно добиться с помощью незначительного изменения сценария оболочки, используя globstarпараметр оболочки , доступный, начиная с Bash v4:

    shopt -s globstar
    for file in **/*.my_custom.*
    do
      your_upload_command "$file"
    done
    
1
18.03.2021, 22:59

Я бы сделал (в системах GNU):

(cd my_directory && find. -name '*.my_custom.*' -type f -print0) |
  tar --null -T - -cf - | gzip -1 | ssh host 'cd my_directory && tar zxf -'
0
18.03.2021, 22:59

Это можно сделать с помощью find.

find my_directory -name "*.my_custom." -type f -exec scp -i {} <username>@<host>:<path>/{}  \;

{}будет содержать путь к соответствующему файлу, начиная с моего каталога _. execуказывает команду, которая будет выполняться для каждого совпадения. Вы можете изменить свой путь scp, помня об этих двух моментах.

0
18.03.2021, 22:59

Теги

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