Используйте команду find
-exec
:
find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} \;
Это запустит mdls
для каждого подходящего имени файла, найденного с помощью find
. Он будет работать с любым именем файла, даже если он содержит пробелы или символы новой строки и т. Д.
, если mdls
может работать с несколькими именами файлов в командной строке, вы можете завершить команду -exec
с помощью +
вместо \;
. например
find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} +
Ваш read -p
внутри цикла "пропускается" (не совсем ), потому что он читает из input.txt
. Все команды внутри цикла по умолчанию наследуют свой стандартный входной поток из цикла, и это связано сinput.txt
Вместо этого вам придется заставить read line
читать из нового дескриптора входного файла и передать содержимое файла по этому:
while IFS= read -r line <&3; do
printf '%s logs\n\n' "$line"
tail -n 100 "Domain1.$line"
read -p 'Press Enter to continue'
done 3<input.txt
Здесь мы используем файловый дескриптор 3 (следующий свободный и доступный файловый дескриптор после стандартных )и подключаем его к входному файлу. Затем мы явно просим read line
прочитать из этот файловый дескриптор , а не из стандартного ввода (файлового дескриптора 0 ). Это оставляет стандартный ввод свободным, и read -p
будет считывать его как обычно.
Кроме того, вы можете поменять местами дескрипторы входных файлов из цикла выше:
while IFS= read -r line; do
printf '%s logs\n\n' "$line"
tail -n 100 "Domain1.$line"
read -p 'Press Enter to continue' <&3
done 3<&0 <input.txt
Теперь read line
читает из файла через обычный стандартный ввод, унаследованный от цикла, в то время как read -p
читает из файлового дескриптора 3. Файловый дескриптор 3 открывается как копия стандартного ввода до того, как стандартный ввод будет перенаправлен из файла..
В оболочке bash
,
read <&3
можно также написать
read -u 3
Таким образом, "самое чистое" решение (в смысле содержащего наименьшее количество синтаксиса манипулирования файловыми дескрипторами )может быть чем-то вроде
while IFS= read -u 3 -r line; do
printf '%s logs\n\n' "$line"
tail -n 100 "Domain1.$line"
read -p 'Press Enter to continue'
done 3<input.txt