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



不幸的是,我对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

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

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

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[@]}"

您可以检查文件是否存在(假设文件列表,每行一个文件名(,并使用

# 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

以获取更多选项。

最新更新