列出目录1中但不在目录2中的文件,反之亦然?

eve*_*veo 10 linux bash shell

嘿,我开始使用bash shell脚本,我正在尝试为一个赋值创建一个脚本,当你输入两个目录时,它会检查它们是否存在并根据错误信息显示,如果两个目录都存在,它将列出之间的差异当前目录.

$ cd dir-1
$ myshellscript . dir-2 (comparing . aka dir-1 against dir-2) 
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我似乎没有检测目录是否存在,也没有列出差异:

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
Run Code Online (Sandbox Code Playgroud)

我必须使用的命令列表,否则我会使用 comm -32 <(ls -la dir-1) <(ls -la dir-2)

http://dl.dropbox.com/u/20930447/index.html
Run Code Online (Sandbox Code Playgroud)

nhe*_*hed 34

有点粗糙 - 但我总是使用的最简单的方法是(可以使用diff params,我通常使用不同的grep

diff -rcw DIR1 DIR2| grep ^Only
Run Code Online (Sandbox Code Playgroud)

然后你可以根据自己的喜好排序和格式化

修改格式化(效率较低,因为我们在这里运行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})
Run Code Online (Sandbox Code Playgroud)

扩展在上面的表达式的sed:
S =搜索和替换
三个"@"是分离的表达(这是传统上与"/"完成)
^匹配行的开头(强制其余不别处匹配).表示任何字符
*表示前一个表达式(.==匹配任何字符)0-N次":"是我在diff输出中匹配的"仅在X中:"

看看妈妈,没有手 - 现在没有"开始"它的开始变得越来越少

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})
Run Code Online (Sandbox Code Playgroud)

您可能想了解IFS ...它需要在bash手册中阅读一些内容,但它基本上是字段分隔符...默认情况下它们包含空格,我不希望循环被分成几行,只是完整的行 - 所以在循环的持续时间我将默认的IFS覆盖到新行和回车.

BTW也许你的教授正在阅读stackoverflow,也许接下来你不会被允许使用分号;-) ...(回到'man bash'...顺便说一句,如果你做'男人bash'在emacs中做,更容易阅读IMO)