2015-06-19 75 views
0

我知道的非常奇怪而具體的問題,但會爲我節省一大筆頭痛。Centos:合併目錄,同時刪除所有子目錄中的公用子目錄

是否可以合併目錄,同時刪除每個子文件中的特定子文件但保留所有文件?例如

/first/1/files/1.jpg, 2.jpg, 3.jpg 
/first/2/files/1.jpg, 2.jpg, 3.jpg 

我也有

/second/1/3.jpg, 4.jpg, 5.jpg 
/second/2/3.jpg, 4.jpg, 5.jpg 

我想合併成/first同時/second/first也消除了其間的/files/目錄但保留所有的JPG文件。最重要的是,我不想3.JPG在/second/

+0

任何你想保留副本的常見文件? –

+0

是的,如果可能的話,如果他們覆蓋那不是什麼大問題,因爲他們應該是同一個文件我只是不是100% –

回答

1

被覆蓋。如果時間戳沒有事,那麼你可以這樣做:

find /second -name '*.jpg' -exec touch + 
for fdir in /first/*/files; do 
    sdir=${fdir%/files}; 
    sdir=${sdir#/tmp/first}; 
    sdir=/tmp/second${sdir}; 
    cp -u "$fdir/"* "$sdir/"; 
done 

儘管這不正是我想稱好的解決方案。

你也可以做到這一點手動測試現有的文件,同時循環和複製這樣的:

for ffile in /first/*/files/*.jpg; do 
    # Expand the variable and delete '/files' 
    sfile=${ffile/\/files} 
    # Expand the variable and remove the '/first' prefix 
    sfile=${sfile#/tmp/first} 
    # Prepend the new '/second' direcory. 
    sfile=/second${sfile} 
    # If the exist do nothing. It if doesn't then copy. 
    [ -f "$sfile" ] || cp -u "$ffile" "$sfile" 
done 

我覺得有可能是一個聰明的方式使用rsync或cpio這樣做,但我不知道那是什麼。

+0

謝謝你的回覆,我有點緊張,試試這個,因爲我有不知道我在做什麼循環的命令行。 –

+0

在每個腳本'echo cp ....'的'cp'之前粘上'echo',它可以安全地作爲測試運行。它會輸出它本來會運行的命令。這是唯一真正做到的事情。 –

+0

或者,如果數據允許它在運行之前進行復制/備份。您還可以在腳本的頂部添加'set -x'來讓shell列出運行時運行的每個命令。 –