我有一个带有文件的子目录的源目录。我还有一个目标目录,其子目录具有另一种结构。
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 :(得分: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)
有点骇客,但你可以用find
和diff
做一些事情,不需要Python:
diff -u <(cd sourcedir && find . -type f) <(cd destdir && find . -type f) |\
grep "^\-\./" | sed 's/^-//'
这会将sourcedir
中的文件列表与destdir
中的文件列表进行比较,然后仅打印sourcedir
中但destdir
中不存在的文件。