-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlinux_file_operations.py
More file actions
187 lines (161 loc) · 5.97 KB
/
linux_file_operations.py
File metadata and controls
187 lines (161 loc) · 5.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
"""
import os
import subprocess
import dbus
def get_desktop_environment():
desktop_session = os.environ.get("XDG_CURRENT_DESKTOP") or os.environ.get("DESKTOP_SESSION")
if not desktop_session:
return None
desktop_session = desktop_session.lower()
if "gnome" in desktop_session:
return "gnome"
if "cinnamon" in desktop_session:
return "cinnamon"
if "mate" in desktop_session:
return "mate"
if "xfce" in desktop_session:
return "xfce"
if "kde" in desktop_session:
return "kde"
return None
def gnome_file_operation(method, src_list, dst=None):
bus = dbus.SessionBus()
nautilus = bus.get_object('org.gnome.Nautilus', '/org/gnome/Nautilus')
iface = dbus.Interface(nautilus, dbus_interface='org.gnome.Nautilus.FileOperations')
src_uris = [f'file://{src}' for src in src_list]
if dst:
dst_uri = f'file://{dst}'
else:
dst_uri = None
if method == 'CopyURIs':
iface.CopyURIs(src_uris, dst_uri)
elif method == 'MoveURIs':
iface.MoveURIs(src_uris, dst_uri)
elif method == 'Trash':
iface.Trash(src_uris)
elif method == 'Delete':
iface.Delete(src_uris)
elif method == 'Rename':
if len(src_list) != 1:
raise ValueError("Rename operation requires exactly one source path.")
iface.MoveURIs(src_uris, dst_uri)
else:
raise ValueError(f"Unsupported method: {method}")
def nemo_file_operation(method, src_list, dst=None):
bus = dbus.SessionBus()
nemo = bus.get_object('org.nemo.Nemo', '/org/nemo/FileOperations')
iface = dbus.Interface(nemo, dbus_interface='org.nemo.FileOperations')
src_uris = [f'file://{src}' for src in src_list]
if dst:
dst_uri = f'file://{dst}'
else:
dst_uri = None
if method == 'CopyURIs':
iface.CopyURIs(src_uris, dst_uri)
elif method == 'MoveURIs':
iface.MoveURIs(src_uris, dst_uri)
elif method == 'Trash':
iface.Trash(src_uris)
elif method == 'Delete':
iface.Delete(src_uris)
elif method == 'Rename':
if len(src_list) != 1:
raise ValueError("Rename operation requires exactly one source path.")
iface.MoveURIs(src_uris, dst_uri)
else:
raise ValueError(f"Unsupported method: {method}")
def caja_file_operation(method, src_list, dst=None):
bus = dbus.SessionBus()
caja = bus.get_object('org.mate.Caja', '/org/mate/Caja')
iface = dbus.Interface(caja, dbus_interface='org.mate.Caja.FileOperations')
src_uris = [f'file://{src}' for src in src_list]
if dst:
dst_uri = f'file://{dst}'
else:
dst_uri = None
if method == 'CopyURIs':
iface.CopyURIs(src_uris, dst_uri)
elif method == 'MoveURIs':
iface.MoveURIs(src_uris, dst_uri)
elif method == 'Trash':
iface.Trash(src_uris)
elif method == 'Delete':
iface.Delete(src_uris)
elif method == 'Rename':
if len(src_list) != 1:
raise ValueError("Rename operation requires exactly one source path.")
iface.MoveURIs(src_uris, dst_uri)
else:
raise ValueError(f"Unsupported method: {method}")
def thunar_file_operation(method, src_list, dst=None):
src_paths = ' '.join(src_list)
if dst:
dst_path = dst
else:
dst_path = ""
command_map = {
'CopyURIs': f'thunar --bulk-rename {src_paths} {dst_path}',
'MoveURIs': f'thunar --bulk-rename {src_paths} {dst_path}',
'Trash': f'thunar --trash {src_paths}',
'Delete': f'thunar --remove {src_paths}',
'Rename': f'thunar --bulk-rename {src_paths} {dst_path}',
}
if method in command_map:
subprocess.run(command_map[method], shell=True)
else:
raise ValueError(f"Unsupported method: {method}")
def kio_file_operation(method, src_list, dst=None):
src_uris = ' '.join(src_list)
if dst:
dst_uri = dst
else:
dst_uri = ""
command_map = {
'CopyURIs': f'kioclient5 copy {src_uris} {dst_uri}',
'MoveURIs': f'kioclient5 move {src_uris} {dst_uri}',
'Trash': f'kioclient5 trash {src_uris}',
'Delete': f'kioclient5 del {src_uris}',
'Rename': f'kioclient5 move {src_uris} {dst_uri}',
}
if method in command_map:
subprocess.run(command_map[method], shell=True)
else:
raise ValueError(f"Unsupported method: {method}")
def perform_file_operation(operation, src_list, dst=None):
desktop_env = get_desktop_environment()
if desktop_env == 'gnome':
gnome_file_operation(operation, src_list, dst)
elif desktop_env == 'cinnamon':
nemo_file_operation(operation, src_list, dst)
elif desktop_env == 'mate':
caja_file_operation(operation, src_list, dst)
elif desktop_env == 'xfce':
thunar_file_operation(operation, src_list, dst)
elif desktop_env == 'kde':
kio_file_operation(operation, src_list, dst)
else:
raise EnvironmentError("Unsupported desktop environment or unable to detect desktop environment.")
def copy_files_with_dialog(src_list, dst):
perform_file_operation('CopyURIs', src_list, dst)
def move_files_with_dialog(src_list, dst):
perform_file_operation('MoveURIs', src_list, dst)
def rename_file_with_dialog(src, dst):
perform_file_operation('Rename', [src], dst)
def delete_files_with_dialog(src_list):
perform_file_operation('Delete', src_list)
def move_to_recycle_bin(src_list):
perform_file_operation('Trash', src_list)
if __name__ == "__main__":
# Example usage of the functions
src_paths = ["/path/to/source1", "/path/to/source2"]
dst_path = "/path/to/destination"
new_name = "/path/to/new_name"
# Uncomment the desired operation to test
# copy_files_with_dialog(src_paths, dst_path)
# move_files_with_dialog(src_paths, dst_path)
# rename_file_with_dialog(src_paths[0], new_name)
# delete_files_with_dialog(src_paths)
# move_to_recycle_bin(src_paths)