#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
?