在嵌套文件结构中查找缺少的文件名

时间:2016-07-22 19:02:20

标签: bash filenames

我有一个带有文件的子目录的源目录。我还有一个目标目录,其子目录具有另一种结构。

fileNames = <get all file names from source directory>
for fileName in fileNames {
    if <not found in destination directory> {
         print fileName
    }
}

如何在上面进行伪代码?

修改

Example file structure:
./sourcedir/file1.txt
./sourcedir/foldera/file2.txt
./sourcedir/foldera/missingfile.txt

./destdir/file2.txt
./destdir/folderb/file1.txt

所以应该打印missingfile.txt。但不是file1.txt或file2.txt,因为它们可以在destdir的某个地方找到。

EDIT2: 我设法做了一个Python实现,这是我的目标。尝试时我遇到了bash答案的麻烦。在bash中可以做得更简单吗?

import os
import fnmatch

sourceDir = "./sourcedir"
destinationDir = "./destdir"

def find_files(directory, pattern):
    for root, dirs, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                filename = os.path.join(root, basename)
                yield filename

print sourceDir
for sourcefilename in find_files(sourceDir, '*'):
     #if not sourcefilename.lower().endswith(('.jpg', '.jpeg', '.gif', '.png','.txt','.mov','3gp','mp4','bmp')):
     #  continue
     shouldPrint = True
     for destfilename in find_files(destinationDir, '*'):
         sourceBaseName = os.path.basename(sourcefilename)
         destBaseName = os.path.basename(destfilename)
         if sourceBaseName == destBaseName:
             shouldPrint = False
             break
     if shouldPrint:
         print 'Missing file:', sourcefilename

2 个答案:

答案 0 :(得分:1)

使用bash可以通过运行diff -r source_dir target_dir | grep Only.*source_dir | awk '{print $4}'轻松完成。

  • diff -r source_dir target_dir显示了source_dir和target_dir
  • 之间的差异
  • grep Only.*source_dir将过滤掉源目录中但不在目标目录中的所有文件
  • awk '{print $4}'会过滤掉文件名

答案 1 :(得分:0)

有点骇客,但你可以用finddiff做一些事情,不需要Python:

diff -u <(cd sourcedir && find . -type f) <(cd destdir && find . -type f) |\
grep "^\-\./" | sed 's/^-//'

这会将sourcedir中的文件列表与destdir中的文件列表进行比较,然后仅打印sourcedir中但destdir中不存在的文件。