у меня есть несколько файлов в каталоге с именем 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
?
Вы можете сделать это так и следовать советам @sudodus для улучшения вывода.
Однако find
- это перебор для вашего случая, вы можете просто использовать ls
:
ls -1 files/abc*
Чтобы получить имя каталога:
(cd files && ls -1 abc*)
Да, это хорошо. Но когда вы ближе познакомитесь с 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
.