不幸的是,我对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
答案 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
了解更多选择。