Как я могу повторить вывод команды, которая ничего не возвращает / ноль?

Это плохо по всем причинам, по которым простой 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 {} +

0
08.07.2017, 01:52
3 ответа

Я бы рекомендовал использовать 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возвращает не -ноль (, т. е. не найдены соответствующие файлы ), выполняется это эхо. Если команды перед этим успешны, это не будет выполнено.

2
28.01.2020, 02:16

Вы можете использовать операторы проверки строк -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
3
28.01.2020, 02:16
#!/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
0
28.01.2020, 02:16

Теги

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