首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出directory1中但不在directory2中的文件,反之亦然?

列出directory1中但不在directory2中的文件,反之亦然?
EN

Stack Overflow用户
提问于 2011-03-12 06:34:46
回答 6查看 11.9K关注 0票数 10

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

代码语言:javascript
复制
$ cd dir-1
$ myshellscript . dir-2 (comparing . aka dir-1 against dir-2) 

输出:

代码语言:javascript
复制
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

到目前为止,我似乎没有检测到目录是否存在,也没有列出不同之处:

代码语言:javascript
复制
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)

代码语言:javascript
复制
http://dl.dropbox.com/u/20930447/index.html
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-03-12 07:22:48

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

代码语言:javascript
复制
diff -rcw DIR1 DIR2| grep ^Only

然后,您可以根据自己的喜好进行排序和格式化

修改为格式(效率较低,因为我们在这里运行了两次diff ...容易解决)

代码语言:javascript
复制
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‘它开始变得越来越不粗糙了

代码语言:javascript
复制
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更容易阅读)

票数 34
EN

Stack Overflow用户

发布于 2011-03-12 07:09:04

这几乎是可行的。它主要在两个目录之间存在按字母顺序排列的相似位置的文件时失败。

代码语言:javascript
复制
sdiff -s <(ls -1 dir1) <(ls -1 dir2)
票数 2
EN

Stack Overflow用户

发布于 2011-03-12 08:09:50

代码语言:javascript
复制
awk '{a[$0]++}END{print "some message"; for(i in a)if(a[i]<2){print i}}' <(ls -1 dir2) <(ls -1 dir1)

概念证明

代码语言:javascript
复制
$ 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.txt
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5279090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档