synology_link_manipultor/hdlink_to_symlink.py

65 lines
2.2 KiB
Python
Raw Permalink Normal View History

2021-07-17 11:02:29 +10:00
import pathlib
from pathlib import Path
import os
import pandas as pd
import argparse
def get_inode_path(p: Path):
return {'inode': os.stat(p, follow_symlinks=False).st_ino, 'path':p}
def more_than_one_link(filename):
return os.stat(filename).st_nlink == 2
def list_inode(directory):
print("hardlinks:" + str(directory))
ino_path = []
for p in directory.rglob('*'):
if "eaDir" not in str(p):
if Path(p).is_symlink() is False and more_than_one_link(p):
ino_set = get_inode_path(Path(p))
ino_path.append(ino_set)
return(ino_path)
def replace_hdlink_with_symlink(table_linkPaths):
for idx, row in table_linkPaths.iterrows():
link = row['path_downloads'].resolve()
target = row['path_library'].resolve()
target_name = target.name
relpath_parent = os.path.relpath(path=target.parent, start=link.parent)
print("Remove: " + str(link))
os.remove(link)
link.symlink_to(os.path.join(relpath_parent, target_name))
if __name__ == "__main__":
parser = argparse.ArgumentParser(description = 'convert hardlink to symlink in download folder')
parser.add_argument('Download',
metavar='--download',
type=str,
help='the path to downloadfolder (e.g. downloads/complete)')
parser.add_argument('Library',
metavar='--library',
type=str,
help='the path to library foler (e.g. Movies)')
args = parser.parse_args()
path_download = args.Download
path_library = args.Library
library_files = list_inode(Path(path_library))
download_files = list_inode(Path(path_download))
df_library = pd.DataFrame(library_files)
df_library.columns = ['inode', 'path_library']
df_library.to_csv('df_library.csv')
df_downloads = pd.DataFrame(download_files)
df_downloads.columns = ['inode', 'path_downloads']
df_downloads.to_csv('df_downloads.csv')
merged_df = pd.merge(left=df_downloads, right=df_library, on = 'inode')
print(merged_df.shape)
print(merged_df)
# replace_hdlink_with_symlink(merged_df)