如何使用bash识别不在列表中的文件?

时间:2017-04-05 12:15:32

标签: bash sh

不幸的是,我对bash的了解并不是很好,而且我的任务非常非标准。

我有一个包含文件列表的文件。

示例:/tmp/my/file1.txt /tmp/my/file2.txt

如何编写一个脚本,可以检查文件夹/tmp/my中的文件是否存在,并在脚本完成后有两种类型的消息。

1 - 文件存在并显示文件:

/tmp/my/file1.txt 
/tmp/my/file2.txt

2 - 文件夹/tmp/my,包括列表中没有的文件和文件夹。文件和文件夹:

/tmp/my/test 
/tmp/my/1.txt

2 个答案:

答案 0 :(得分:0)

你说文件和文件夹,似乎不清楚。

无论如何,我想用数组来试试,所以我们走了:

unset valid_paths; declare -a valid_paths
unset invalid_paths; declare -a invalid_paths
while read -r line
do
if [ -e "$line" ]
  then
    valid_paths=("${valid_paths[@]}" "$line")
  else
    invalid_paths=("${invalid_paths[@]}" "$line")
  fi
done < files.txt
echo "VALID PATHS:"; echo "${valid_paths[@]}"
echo "INVALID PATHS:"; echo "${invalid_paths[@]}"

答案 1 :(得分:0)

您可以检查文件是否存在(假设文件列表,每行一个文件名)并使用此前缀打印现有文件

# Part 1 - check list contents for files
while read thefile; do
    if [[ -n "$thefile" ]] && [[ -f "/tmp/my/$thefile" ]]; then
        echo "Y: $thefile"
    else
        echo "N: $thefile"
    fi
done < filelist.txt | sort

# Part 2 - check existing files against list
for filepath in /tmp/my/* ; do
    filename="$(basename "$filepath")"
    grep "$filename" filelist.txt -q || echo "U: $filename"
done

现有文件的前缀为Y:,其他所有文件都以N:为前缀

在第二部分中,tmp目录中不在文件列表中的文件标有U:(未计入/意外)

您可以交换检查路径存在的-f测试,并且是-d的常规文件(存在且是目录)或-e(存在)

man test

了解更多选择。