如何列出一个文件夹中某处出现的所有文件,而不是另一个文件夹?

斯坦·希曼斯基

我有一个文件夹,里面有很多子文件夹和文件(我们称之为“orig”),还有另一个文件夹,其中许多相同的文件作为备份放置在不同的文件夹结构中(我们称之为“备份”)。我想列出 'backup' 中尚未存在于 'orig' 中的所有文件,以便我可以将它们放在 'orig' 中的正确 subvolder 中并删除 'backup'。按文件名和大小进行比较就足够了。

之前也有人问过类似的问题,推荐的解决方案是diff -qr orig/ backup/但是,当我尝试这样做时,我发现递归不起作用,因为命令列出了一个文件夹中出现的文件夹,而不是另一个文件夹,而不是文件。这是一个例子。首先我创建两个文件夹,每个文件夹有一个子文件夹和一个文件,其中每个子文件夹和文件都有不同的内容:

$ mkdir orig
$ mkdir backup
$ mkdir orig/1
$ mkdir backup/2
$ echo 'blah' > orig/1/test.txt
$ ls orig/1
test.txt
$ echo 'blah1' > backup/2/test1.txt

现在我使用 '-qr' 选项比较它们:

$ diff -qr orig/ backup/
Only in orig/: 1
Only in backup/: 2

如果我进入其中之一的子文件夹,则会找到该文件夹​​中的文件:

$ diff -r orig/1 backup/
Only in backup/: 2
Only in orig/1: test.txt

无论是否使用“-qr”,我实际上都会得到相同的行为。这是一个错误还是我误解了差异?我正在使用差异(GNU diffutils)3.7。

关于如何解决我的问题的任何其他建议将不胜感激(例如一个简单的 python 脚本)。

斯坦·希曼斯基

我找到了一种如何使用 python 解决我的问题的方法:

import filecmp
import os.path

def find_unique_files(path_orig, path_duplicates, ommit_in_orig=[]):
    """
    Crawls all subfolders of path_duplicates and
    returns list of files (incl. paths) that occur
    in path_duplicates but no-where in path_orig,
    except for folders listed in ommit_in_orig. 
    Do not forget to add trailing '/' at the end of paths.
    
    Arguments:
    path_orig -- string
    path_duplicates -- string
    ommit_in_orig -- list of strings
    
    Returns:
    list of strings indicating paths to files.
    
    Example:
        find_unique_files('/home/user/project/', 
                          '/home/user/project/backups/',
                          ommit_in_orig=['/home/user/project/backups/',
                                         '/home/user/project/temp/'])
    """
    unique_files = []
    for folder, subfolders, files in os.walk(path_duplicates):
        print(folder, end='\r')

        for file in files:
            unique = 1
            filepath = os.path.join(folder,file)
            for folder1, subFolders1, files1 in os.walk(path_orig):
                # Check if folder1 is a subfolder of ommit_in_orig
                ommit = [s for s in ommit_in_orig if s.lower() in folder.lower()]
                if len(ommit) == 0:
                    if file in files1:
                        filepath1 = os.path.join(folder1, file)
                        if filecmp.cmp(filepath,filepath1):
                            # File is identical
                            unique = 0
            if unique == 1:
                unique_files.append(filepath)
    return unique_files
path_orig = 'orig/'
path_duplicates = 'backup/'
find_unique_files(path_orig, path_duplicates)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从Eclipse的另一个文件夹中的一个文件夹导入protobuf文件?

文件夹中除一个命名文件夹外的所有文件夹的glob

如何用一些简短的方法将所有文件和文件夹从一个文件夹移到php中S3存储桶的另一个文件夹?

从另一个文件夹收集文件

将所有文件从一个文件夹复制到另一个

如何将一个文件夹中的所有文件复制到另一个文件夹并更改扩展名?

如果文件与另一个文件夹匹配,如何从一个文件夹返回所有文件名?

使用Python将所有文件从一个SFTP文件夹存档到另一个文件夹

(Linux)用另一个文件中的数据递归覆盖文件夹中的所有文件

在更改时将所有文件更改从一个文件夹连续复制到另一个文件夹(Windows)

在另一个文件夹中显示一个文件夹的内容

从一个文件夹中复制所有文件和文件夹

取得包含文件的文件目录,并将所有文件写入另一个文件夹中名称不同的文件夹

在VSS 2005中,如何在另一个项目下移动一个项目(以及所有关联的文件夹和文件)?

PHP将所有图像文件夹从一个文件夹复制到另一个文件夹

在另一个文件夹中创建相同的子文件夹

将所有用户的所有ini文件从一个文件夹复制到另一个文件夹

在文件夹及其所有子文件夹的所有文件中搜索并替换另一个子字符串

根据列表将所有文件从一个文件夹移动到另一个文件夹

如何确定另一个文件夹中存在的文件或文件夹?

如何将文件/文件夹的权限和所有权从一个文件夹复制到另一个文件夹(递归)

[Unix][Shell Script] 将一个文件夹中的所有文件复制到另一个文件夹

如何将一个文件夹复制到另一个文件夹

Linux如何删除前缀与另一个文件夹不匹配的文件夹中的文件?

使用 Node js 将所有 .txt 文件从一个文件夹移动到另一个文件夹

如何在Python中打开另一个文件夹中的文件?

从另一个文件夹访问一个文件夹

需要使用java将所有文件从一个文件夹复制到另一个文件夹

如何更改文件夹中的所有图像并将更改的图像保存到另一个文件夹?