2016-07-22 50 views
-1

我有一個包含文件的子目錄的源目錄。我也有一個目錄目錄與其他結構的子目錄。在嵌套文件結構中查找缺失的文件名

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 
+0

您已將此標籤標記爲[tag:bash]和[tag:python]。你是隨機分配標籤,還是你需要解決方案專門用這兩種語言之一(爲什麼?)? – tripleee

+0

好點。我馬上認爲這兩個標籤可以使用,所以我可以更容易地理解答案。也許最好是堅持一種語言,以避免混淆事物。 – user317706

回答

1

使用bash這個可以通過運行diff -r source_dir target_dir | grep Only.*source_dir | awk '{print $4}'輕鬆完成。

  • diff -r source_dir target_dir顯示
  • grep Only.*source_dir會過濾掉現有的源目錄,但不是在目標目錄
  • awk '{print $4}'將篩選出的文件名
0

所有文件source_dir和TARGET_DIR之間的差異有點破解,但你可以用finddiff做一些事情,不需要Python:

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

這比較文件的sourcedirdestdir的那些列表,然後打印出只存在於sourcedir文件,但不是在destdir