linux 下以广度优先,从根目录开始搜索重复文件,找到5000个截止。
时间: 2024-09-07 19:06:16 浏览: 34
在Linux下,你可以使用`find`命令结合`du`(用于计算磁盘占用空间)和`sort`命令来实现宽度优先的递归查找并删除重复文件,但请注意,这个过程可能需要一些时间,并且最好在测试过小部分文件夹后再处理大量数据,以免误删重要文件。
以下是简单的步骤:
1. 首先,使用`find`命令从根目录开始搜索文件:
```
find / -type f
```
2. 使用`du`计算每个文件的大小,并记录到一个临时文件:
```
find / -type f -print0 | du -sh --files0-from=- > size_list.txt
```
3. 然后,对列表进行排序,按文件大小从小到大排列:
```
sort -n size_list.txt
```
4. 接下来,设置一个计数器(例如5000),并筛选出前5000个重复的文件。这一步可能会比较复杂,因为默认情况下`find`不会直接给出重复文件列表,所以你需要遍历大小排序后的文件,如果发现重复的,就减去计数器,直到达到5000为止。这可以用`awk`、`while`循环等工具配合完成。
```bash
count=5000
awk '{seen[$0]++; if (count && seen[$0] == 2) {print $0; count--;}}' size_list.txt
```
注意:上述脚本会打印出所有重复的文件路径,如果你只想保留其中一个副本,可以使用`mv`或`rm`指令手动删除,但要小心操作,避免意外删除。
相关问题
Python对指定目录进行广度优先优先遍历所有文件
可以使用os.walk()函数实现对指定目录进行广度优先遍历所有文件,具体代码如下:
import os
def bfs_traversal(root_dir):
queue = [root_dir]
while queue:
current_dir = queue.pop(0)
for file_name in os.listdir(current_dir):
file_path = os.path.join(current_dir, file_name)
if os.path.isdir(file_path):
queue.append(file_path)
else:
print(file_path)
bfs_traversal("指定目录路径")
Android编一段在指定目录下找到重复文件并将其显示给用户看的代码
好的,以下是一段基于Java语言的Android代码:
public class MainActivity extends AppCompatActivity {
private Button btnFindDuplicates;
private TextView tvDuplicate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnFindDuplicates = findViewById(R.id.btn_find_duplicate);
tvDuplicate = findViewById(R.id.tv_duplicate);
btnFindDuplicates.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File dir = new File(Environment.getExternalStorageDirectory() + "/folder"); // 指定目录
List<File> duplicates = findDuplicates(dir);
if (duplicates.size() > 0) { // 找到了重复文件
StringBuilder sb = new StringBuilder();
for (File f : duplicates) {
sb.append(f.getName()).append("\n");
}
tvDuplicate.setText(sb.toString());
} else { // 没有重复文件
tvDuplicate.setText("没有找到重复文件!");
}
}
});
}
private List<File> findDuplicates(File root) {
List<File> duplicates = new ArrayList<>();
if (root == null || !root.isDirectory()) return duplicates;
Map<String, File> map = new HashMap<>();
Queue<File> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
File dir = queue.poll();
File[] files = dir.listFiles();
if (files == null) continue; // 无法访问该目录
for (File file : files) {
if (file.isDirectory()) {
queue.offer(file);
} else {
String key = file.getName() + file.length(); // 将文件名和大小作为key
if (!map.containsKey(key)) {
map.put(key, file);
} else {
File existingFile = map.get(key);
if (existingFile != null) { // 该文件已被标记为重复
duplicates.add(existingFile);
map.put(key, null); // 标记为已找到
}
duplicates.add(file);
}
}
}
}
return duplicates;
}
}
请确保已在AndroidManifest.xml文件中添加了读写存储权限。这段代码使用了广度优先搜索算法来查找指定目录下的所有文件,并将它们的文件名和大小作为key存入Map中,重复的文件名会映射到同一个key上。最后,遍历map,将value为空的key对应的文件加入到重复文件列表中。