Это плохо по всем причинам, по которым простой xargs
является плохим, а именно он ломается с именами файлов, содержащими пробелы или обратную косую черту:
$ touch "foo bar"
$ echo * | xargs -n1 echo
foo
bar
Кроме того, он запускает копию ( external) команда echo
для каждого файла.
В большинстве оболочек вы можете использовать printf "%s\n" *
для получения листинга. Или ls -1
.
Однако вопрос в том, что вы хотите делать со списком файлов? Просто посмотреть на них или использовать их в сценарии? Для последнего вам, вероятно, лучше использовать
for f in * ; do something with "$f" ; done
или какой-либо вариант find ... -exec somecmd {} +
Я бы рекомендовал использовать grep
и коды возврата, чтобы сделать жизнь немного проще.
while read -r LINE
do
find. -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"
done < /path/to/fnames.txt
Как это работает:
find. -name "${LINE}"
уверен, что вы знаете это, найдите файлы в текущем каталоге, которые соответствуют${LINE}
| grep "${LINE}"
направить вывод на grep
. Мы делаем это для получения возвращаемого значения, которое find
обычно не дает полезного значения. Если grep
соответствует чему-либо, совпадение будет напечатано, и команда вернет 0. Если ничего не совпадает, ничего не будет напечатано, и будет возвращено ненулевое возвращаемое значение -.
|| echo "${LINE} not found"
||
является каналом ИЛИ, если одна из команд до того, как она вернет не -ноль, она будет выполнена. Таким образом, если grep
возвращает не -ноль (, т. е. не найдены соответствующие файлы ), выполняется это эхо. Если команды перед этим успешны, это не будет выполнено.
Вы можете использовать операторы проверки строк -z
и -n
:
String operators:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
напр.
while read -r LINE; do
output=$(find. -name "$LINE")
if [[ -z "$output" ]]; then
echo "$LINE not found"
else
echo "$output"
fi
done < fnames.txt
company_TOYOTA_666_696969696* not found
./company_FORD_123_435345666asdfgh
company_MAZDA_333_333333333* not found
./company_HONDA_777_7777777771242jkk
company_FERARI_999_999999999* not found
где
$ ls -1 company*
company_FORD_123_435345666asdfgh
company_HONDA_777_7777777771242jkk
#!/bin/bash
while read -r LINE
do
output=$(find. -name "$LINE" 2> /dev/null)
if [[ -z $output ]]; then
echo "$LINE Not Found"
else
echo "$output"
fi
done < /path/to/fnames.txt