不幸的是,我对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
以获取更多选项。