Проверка наличия файлов в оболочке

#shell

#оболочка

Вопрос:

У меня есть список файлов, и я хотел бы передать команду, чтобы проверить, существует ли каждый файл

 cat files.txt | command
 

Существует ли какая-либо команда для этого? Должен ли я писать скрипт? Можете ли вы помочь мне написать это?

Например:

 > cat files.txt
libs/cakephp/app_exp/views/elements/export-menu.ctp
libs/cron/prad_import.php
main/css/admin/remarketing-graph.css
main/images/dropd-arrow.png
main/includes/forms/export/export_menu.php
main/jquery/jquery/jquery.cookie.js
main/mvc/controllers/remarketing/prad_controller.php
main/mvc/controllers/remarketing/remarketing_controller.php
 

но некоторые из этих файлов не завершаются, поэтому я хочу сделать

 > cat files.txt | command
libs/cakephp/app_exp/views/elements/export-menu.ctp
main/css/admin/remarketing-graph.css
main/images/dropd-arrow.png
main/includes/forms/export/export_menu.php
main/jquery/jquery/jquery.cookie.js
 

возвращает только существующие файлы

Комментарии:

1. cat files.txt | command лучше записывается как command < files.txt (или как command file.txt если command бы можно было принимать входной файл в качестве аргумента командной строки).

Ответ №1:

Вы действительно используете #!/bin/sh ? В каком контексте? В старой среде Unix или в современной, урезанной среде env с минимальными cmds?

Можете ли вы использовать #!/bin/bash или #!/bin/ksh ? Это упростит задачу.

Но в любой оболочке это должно работать

 while read line ; do if [ -f "$line" ] ; then echo "$line" ; fi ; done < files.txt
 

Это должно допускать наличие файлов / путей с пробелами в них, но если в имена файлов встроены другие нечетные символы, возможно, потребуется дополнительная работа.

IHTH

Ответ №2:

 test -f "files.txt" amp;amp; cat "files.txt" | command
 

Также

 [[ -f "files.txt" ]] amp;amp; cat "files.txt" | command  # in BASH
 

выбирайте сами. test более переносим.

Понимая, что вы хотите command проверить наличие файла, тогда вам вообще не нужен канал. Вы можете сделать что-то подобное с while помощью цикла:

 while read file; do
    if test -f "$file"; then
        echo "the file exists"  # or whatever you want to do
    else
        echo "the file does NOT exist"  # or whatever you want to do
    fi
done < "files.txt"
 

Это приведет к построчному чтению файла и проверке каждого файла на наличие. Вы также можете прочитать все имена файлов из files.txt в массив, а затем выполните цикл по массиву, если вы предпочитаете. И да, вышесказанное может быть сценарием.

Комментарии:

1. На самом деле, я задал command свой вопрос, это команда, о которой я прошу. Вы предлагаете cat files.txt | test -f ?