好的,这是我关于该主题的第五个线程,因为我在这个可怕的任务的各个方面都迷失了方向。我使用过其他解决方案,它们运行良好但无法使用,例如使用 awk
命令、sed
和 comm
。相反,必须以艰难的方式做到这一点。
我很迷茫,在这一点上我什至没有交上去,因为它已经过了截止日期,所以它是零,过去 18 小时我一直在努力争取这个只是为了完成它而完成。如果您能救我一枪,我将不胜感激。
作业要点:您要编写一个 Bash shell 脚本,这将有助于比较两个目录的内容。编写满足以下要求的实用程序:
- 您的脚本将比较文件名 在两个目录中,并列出 有关文件名的信息 在一个目录中,但不在另一个目录中。 列出的信息将是 每个文件的长列表,类似 到“ls -l”命令。这 必须指定目录名称, 包括任何必需的绝对或 相对路径。
- 您的脚本适用于所有类型 文件,包括目录 包含在指定的 目录。该脚本将打印 一个适当的错误消息,如果 传递给它的参数数量是 2 以外的其他值,或者如果 指定的目录名称不是 有效的现有目录的名称。 如果发出错误消息,则 脚本应该以退出结束 状态为 1(一)。否则,它 应该以 0 的退出状态结束 (零)。
规范:
- 目录中的文件 脚本应该在不工作 有执行权限,只读 如果我没记错的话只能 显示文件名,所以我们看不到 文件内容。我试过了,我明白了 权限被拒绝。
- 关于此的所有信息 作业可以在这里找到: https://cs.senecac.on.ca/~lczegel/BTO120/assign1/assign1.html
我做了什么:
#!/bin/bash
if [ ! -d $1 ]
then
echo $1 is not a valid existing directory >&2
exit 1
elif [ ! -d $2 ]
then
echo $2 is not a valid existing directory >&2
exit 1
elif [ $# = 0 ]
then
echo Usage: compdir dir-name1 dir-name2 >&2
exit 1
elif [ $# = 1 ]
then
echo Usage: compdir dir-name1 dir-name2 >&2
exit 1
elif [ $# = 2 ]
then
ls -a $1 > temp1
ls -a $2 > temp2
cat temp1 |
while read input
do
grep -Fvf temp1 temp2 > temp1_diff
done
cat ~temp2 |
while read input
do
grep -Fvf temp2 temp1 > temp2_diff
done
#Files that are in $1 but not in $2
cat temp1_diff |
while read input
do
Files that are in $1 but not in $2
cd $2
ls -la `cat ../temp1_diff`
done
cd ..
echo -e
#Files that are in $2 but not in $1
cat temp2_diff |
while read input
do
Files that are in $2 but not in $1
cd $1
ls -la `cat ../temp2_diff`
done
elif [ $# = 3 ]
then
echo Usage: compdir dir-name1 dir-name2 >&2
exit 1
else
echo Usage: compdir dir-name1 dir-name2 >&2
exit 1
fi
我遇到的问题:
- 它不会写入任何文件 有任何字符,如点或 空格或其中的任何内容 temp1_diff 和 temp2_diff。
- 我无法让 echo 回显一次 即使它在循环之前或循环中。
- 我经常收到它无法解决的错误 导航到 $1 或 $2 等。
最佳答案
这样处理怎么样:
for f in `ls -a $1`
do
if [ -r $1/$f ] && [ ! -x $1/$f ] && [ ! -r $2/$f ]
then
echo "$f Not in other dir"
现在您知道该文件在您的第一个目录中,但不在第二个目录中。
编辑:更改为检查第一个目录中的文件是否可读 + 根据相关规范不可执行 - 这将告诉您它是否不在具有读取权限的另一个目录中
关于linux - 显示两个目录之间的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5285882/