2017-06-21 70 views
1

符號鏈接,我有以下文件夾結構:創建CP保留母體結構

. 
`-- top_level/ 
    |-- sub-01_ses-01/ 
    | `-- filtered_data.tar.gz* 
    |-- sub-01_ses-02/ 
    | `-- filtered_data.tar.gz* 
    |-- sub-02_ses-01/ 
    | `-- filtered_data.tar.gz* 
    |-- sub-02_ses-02/ 
    | `-- filtered_data.tar.gz* 

我想創建符號鏈接到這些文件保存於母體結構(因爲它們都具有相同的文件名)。 這裏是我的嘗試:

find -name "filtered_data.tar.gz" \ 
    -exec cp -s --parents --no-clobber -t /home/data/filtered {} \; 

現在,我注意到,CP不會創建父結構,但符號鏈接失敗,我得到通知如下:

CP:'/home/data/filtered/./sub-01_ses-01/filtered_data.tar.gz':可以使僅在當前目錄中的相對符號鏈接

我想了解爲什麼會發生這種情況,以及cp警告是如何告訴我的。此外,任何關於如何解決這個問題的指針將不勝感激。

回答

1

發現這裏的解決方案:symlink-copying a directory hierarchy

的文件的路徑cp必須是絕對的,而不是./something。所以,這應該適合你:

find $(pwd) -name "filtered_data.tar.gz" \ 
    -exec cp -s --parents --no-clobber -t /home/data/filtered {} \; 

根據你對你真的想做什麼的評論,這是一個Python腳本。你應該可以調整它。

#!/usr/bin/env python3 

import os 

target_filename = 'filtered_data.tar.gz' 
top_src_dir = '.' 
top_dest_dir = 'dest' 

# Walk the source directory recursively looking for 
# target_filename 
for parent, dirs, files in os.walk(top_src_dir): 
    # debugging 
    # print(parent, dirs, files) 

    # Skip this directory if target_filename not found 
    if target_filename not in files: 
     continue 

    # Strip off all path parts except the immediate parent 
    local_parent = os.path.split(parent)[-1] 
    # Compute the full, relative path to the symlink 
    dest_file = os.path.join(top_dest_dir, local_parent, target_filename) 

    # debugging 
    # print('{} {}'.format(dest_file, os.path.exists(dest_file))) 

    # Nothing to do if it already exists 
    if os.path.exists(dest_file): 
     print('{} already exists'.format(dest_file)) 
     continue 

    # Make sure the destination path exists 
    dest_dir = os.path.dirname(dest_file) 
    os.makedirs(dest_dir, exist_ok=True) 

    # Translate the relative path to target_filename 
    # to be relative based on the new destination dir 
    src_file = os.path.join(parent, target_filename) 
    src_file = os.path.relpath(src_file, start=dest_dir) 

    os.symlink(src_file, dest_file) 
    print('{} --> {}'.format(dest_file, src_file)) 
+0

謝謝,這確實有效,但是我得到**整個父結構**!我只想要從'sub-XX_ses-XX'開始的結構 – dangom

+1

它看起來不像'cp'支持那樣。您可能需要編寫腳本或程序(Python很容易)來執行此操作。 – Harvey