как использовать аргумент командной строки для поиска .txt файла с общим именем

у меня есть несколько файлов в каталоге с именем files . Мне нужно прочитать каждый файл .txt из этого каталога:

abc123.txt
abc234.txt
abc345.txt
abc.txt
def123.txt
def234.txt
def345.txt

Например, когда я набираю ./ filter.sh abc в терминале, он будет искать .txt файл, имя которого содержит abc .

#!/bin/bash
 
input1=$1


find ./files -type f -name "*$input1*.txt" 

мои результаты выглядят так

./files/abc345.txt
./files/abc234.txt
./files/abc123.txt
./files/abc.txt

правильно ли я делаю? А также, можно ли не отображать ./ files / в выводе? И почему мой вывод показывает abc345 , abc234 , abc123 вместо abc123 , abc234 , abc345 ?

5
задан 7 June 2021 в 22:09

2 ответа

Вы можете сделать это так и следовать советам @sudodus для улучшения вывода.

Однако find - это перебор для вашего случая, вы можете просто использовать ls:

ls -1 files/abc*

Чтобы получить имя каталога:

(cd files && ls -1 abc*)
5
ответ дан 28 July 2021 в 11:31
  • Да, это хорошо. Но когда вы ближе познакомитесь с find , вы сделаете это непосредственно в командной строке (вместо сценария оболочки). Я часто использую сценарии оболочки, но в основном для более крупных задач (несколько командных строк).

  • Вы можете удалить начальную точку, в которой он был найден:

     find ./files -type f -name "* $ input1 * .txt" -printf "% P \ n" 
     
  • Наконец, вы можете впоследствии отсортировать файлы:

     find ./files -type f -name "* $ input1 * .txt" -printf "% P \ n" | sort 
     
  • Если небольшое количество или небольшие файлы, вы можете записать содержимое в терминал с помощью

     find ./files -type f -name "* $ input1 * .txt" -exec echo "- - {}: "\; -exec cat {} \; 
     

    Вывод может быть перенаправлен в файл с помощью > output.txt

     find ./files -type f -name "* $ input1 * .txt "-exec echo" --- {}: "\; -exec cat {} \; > вывод.txt 
     

    Прокрутите по горизонтали, чтобы увидеть конец этой строки.

  • если много файлов или какой-то большой файл, может быть лучше просмотреть файлы в меньшем или, может быть, в вашем любимом текстовом редакторе,

     find ./files -type f -name "* $ input1 * .txt" -exec less {} \; 
     

    и выйти с 'q' из less между каждым файлом.

  • find по сравнению с ls

    • find - это расширенный инструмент , который может [рекурсивно] находить файлы в дереве каталогов и имеет множество опций. Чтобы понять, что с ним можно сделать, нужно много времени. См. man find или, может быть, проще, см. Учебное пособие в Интернете.

    • ls - более простой инструмент , который перечисляет файлы на одном уровне каталогов, обычно на текущем уровне. У него также много опций, но его довольно легко использовать из командной строки . Имейте в виду, что ls может сбивать с толку в сценариях оболочки, особенно в комбинациях с другими командами. См. man ls .

9
ответ дан 28 July 2021 в 11:31

Другие вопросы по тегам:

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