测试shell中文件的存在

时间:2014-06-20 20:13:18

标签: 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

仅返回现有文件

2 个答案:

答案 0 :(得分:1)

test -f "files.txt" && cat "files.txt" | command

另外

[[ -f "files.txt" ]] && 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 :(得分:1)

你真的在使用#!/bin/sh吗?在什么情况下?一个旧的Unix环境,或现代的,精简的环境与最小的cmds?

您可以使用#!/bin/bash#!/bin/ksh吗?这将使它更容易。

但是在任何shell中都可以使用

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

这应该允许文件/路径中包含空格,但如果文件名中嵌入了其他奇数字符,则可能需要更多工作。

IHTH