嘿,我启动了bash shell脚本,我正在尝试为一个赋值创建一个脚本,当你输入两个目录时,它将检查它们是否存在,并根据错误消息显示它们,如果这两个目录都存在,它将列出当前目录之间的差异。
$ cd dir-1
$ myshellscript . dir-2 (comparing . aka dir-1 against dir-2) 输出:
Files that are in . but not in dir-2
-rw------- 1 ddddd users 1 2011-03-1 01:26 123123123
Files that are in dir-2 but not in .
-rw------- 1 ddddd users 1 2011-03-1 01:26 zzzzzzzzzzzz到目前为止,我似乎没有检测到目录是否存在,也没有列出不同之处:
dir-1=$1
dir-2=$2
if [ $# > 2 ]
then
echo "Usage: compdir dir-name1 dir-name 2"
exit 1
elif [ $# < 2 ]
then
echo "Usage: comdir dir-name1 dir-name 2"
elif [ ! -d "$@" ]
then
echo "/$@ is not a valid existing directory"
else
exit 0
fi
echo $dir-1
echo $dir-2我必须使用的命令列表,否则我会使用comm -32 <(ls -la dir-1) <(ls -la dir-2)
http://dl.dropbox.com/u/20930447/index.html发布于 2011-03-12 07:22:48
有点粗糙-但我总是使用的最简单的方法是(可以使用diff参数,我通常使用不同的grep
diff -rcw DIR1 DIR2| grep ^Only然后,您可以根据自己的喜好进行排序和格式化
修改为格式(效率较低,因为我们在这里运行了两次diff ...容易解决)
echo files only in $dir1
LST=$(diff ${dir1} ${dir2}| grep "^Only in ${dir1}"| sed 's@^.*: @@')
(cd ${dir1}; ls -l ${LST})
echo files only in $dir2
LST=$(diff ${dir1} ${dir2}| grep "^Only in ${dir2}"| sed 's@^.*: @@')
(cd ${dir2}; ls -l ${LST})在上面的sed表达式上展开:
s=search和替换
三个'@‘分隔表达式(这通常是用’/‘来完成的)
^匹配一行的开头(强制其他行不匹配)。表示任何字符
*表示前一个表达式(.==match any char) 0-N次":“是我从diff输出中匹配到的"Only in X:”
看,妈妈,没有手-现在没有'sed‘它开始变得越来越不粗糙了
XIFS="${IFS}"
IFS=$'\n\r'
for DIFFLINE in $(diff ${dir1} ${dir2}|grep ^Only); do
case "${DIFFLINE}" in
"Only in ${dir1}"*)
LST1="${LST1} ${DIFFLINE#*:}"
;;
"Only in ${dir2}"*)
LST2+="${DIFFLINE#*:}"
;;
esac
done
IFS="${XIFS}"
echo files only in $dir1
(cd ${dir1}; ls -l ${LST1})
echo files only in $dir2
(cd ${dir2}; ls -l ${LST2})你可能想知道关于IFS的信息。它需要在bash手册中阅读,但它基本上是字段分隔符...默认情况下,它们包含空格,我不希望向循环提供行的一小部分,只提供完整的行-所以在循环期间,我将默认IFS覆盖为仅换行符和回车符。
顺便说一句,也许你的教授正在阅读stackoverflow,也许下一步你将不能使用分号;-)…(回到'man bash‘...顺便说一句,如果你在emacs中使用'man bash‘,会使IMO更容易阅读)
发布于 2011-03-12 07:09:04
这几乎是可行的。它主要在两个目录之间存在按字母顺序排列的相似位置的文件时失败。
sdiff -s <(ls -1 dir1) <(ls -1 dir2)发布于 2011-03-12 08:09:50
awk '{a[$0]++}END{print "some message"; for(i in a)if(a[i]<2){print i}}' <(ls -1 dir2) <(ls -1 dir1)概念证明
$ ls -1 dir1
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
$ ls -1 dir2
file1.txt
file3.txt
file4.txt
$ awk '{a[$0]++}END{print "Files in dir1 but NOT in dir2"; for(i in a)if(a[i]<2){print i}}' <(ls -1 dir2) <(ls -1 dir1)
Files in dir1 but NOT in dir2
file5.txt
file2.txthttps://stackoverflow.com/questions/5279090
复制相似问题