2013-03-20 45 views
4

我試圖在PHP移動文件夾,但如果存在重複保留兩個文件在DEST文件夾。 我試圖在遞歸,但它太複雜了很多事情可能會出錯,例如文件premissions和重複的文件\文件夾。UNIX MV --backup =編號

我嘗試用系統()命令來工作,我無法弄清楚如何移動文件,但保留備份,如果重複而不破壞延伸

$last_line = system('mv --backup=t websites/test/ websites/test2/', $retval); 

給出以下,如果文件中都顯示目錄存在:

ajax.html~ 
ajax.html~1 
ajax.html~2 

什麼即時尋找的是:

ajax~.html 
ajax~1.html 
ajax~2.html 

或任何其他LIK e(1),(2)...但不破壞文件的擴展名。 有什麼想法?請。

p.s必須使用system()命令。

回答

0

如果你想保留原始文件,只需創建一個副本,然後使用cp而不是mv

如果你想創建一個備份存檔,然後做的文件夾的焦油gzip的這樣

tar -pczf name_of_your_archive.tar.gz /path/to/directory/to/backup

+0

那不是什麼問!在這裏我需要移動但不覆蓋原始文件,如果存在的話,做一個副本爲 - 備份呢! – Mike 2013-03-20 16:59:17

+0

這就是你要求的。你沒有移動你創建的文件的副本,我在我的第一行中回答!在你的例子中,你想將測試文件夾移動到名爲test2的文件夾中,這會讓你沒有測試文件夾。如果你想留下一個測試副本,並在test2下創建一個副本,那麼你想使用cp – Dave 2013-03-20 17:00:48

+0

我編輯了開始,所以更多的理解 – Mike 2013-03-20 17:01:11

0
rsync --ignore-existing --remove-source-files /path/to/source /path/to/dest 
+0

我需要移動rsync副本。 – Mike 2013-03-20 17:07:14

+0

更新爲--remove-source-files – Chris 2013-03-20 17:09:09

+0

這不起作用!,我試着用文件和文件夾,如果文件存在,它只是忽略它。不要在dest文件夾內創建源文件的副本,也不要刪除源文件。 – Mike 2013-03-20 17:26:24

0

使用rsync--backup--backup-dir選項。例如:

rsync -a --backup --backup-dir /usr/local/backup/2013/03/20/ /path/to/source /path/to/dest 

每次文件可能被覆蓋時,它會被複制到給定的文件夾以及該項目的路徑。例如:/path/to/dest/path/to/source/file.txt

+0

我不需要一個備份文件夾,我需要在同一個文件夾中的備份。我需要它移動不復制! – Mike 2013-03-20 17:13:55

0

從外觀看,似乎沒有任何內置的方法來備份文件,同時將擴展名保留在正確的位置。可能是錯誤的,但我無法找到一個不符合你原來的問題已經指出的問題。

既然你說,它的複雜的文件在使用PHP,也許你可以做到這一點,你現在正在做同樣的方式,獲得在格式

ajax.html~ 
ajax.html~1 
ajax.html~2 

然後將文件用PHP來複制通過文件解析並將它們重命名爲所需的格式。這樣你就不必處理權限和重複文件,這是你提到的複雜問題。你只需要查找這種格式的文件,並重命名它們。

+0

這個想法是在工作中提出的,但它的效率太低而無法移動,然後緩解它來修復移動 – Mike 2013-03-20 19:21:00

+0

@ user1725378這是否非常頻繁地完成?從某種意義上講,這並不是一回事,但我認爲這不會對性能造成太大影響。 – MysticXG 2013-03-20 20:43:49

+0

它的所有服務器都會(隨機移動文件和文件夾從一個位置到另一個位置)。它必須在一個滑動。 – Mike 2013-03-21 05:15:55

0

我並不嚴格回答你的問題,但我在這裏介紹的情況是很常見的,因此有效!

這是我的黑客!

應用於文件:

#!/bin/bash 

# It will find all the files according to the arguments in 
# "<YOUR_ARGUMENT_TO_FIND_FILES>" ("find" command) and move them to the 
# "<DEST_FOLDER>" folder. Files with the same name will follow the pattern: 
# "same_name.ext", "same_name (1).ext", "same_name (2).ext", 
# "same_name (3).ext"... 

cd <YOUR_TARGET_FOLDER> 
mkdir ./<DEST_FOLDER> 
find ./ -iname "<YOUR_ARGUMENT_TO_FIND_FILES>" -type f -print0 | xargs -0 -I "{}" sh -c 'cp --backup=numbered "{}" "./<DEST_FOLDER>/" && rm -f "{}"' 
cd ./<DEST_FOLDER> 
for f_name in *.~*~; do 
    f_bak_ext="${f_name##*.}" 
    f_bak_num="${f_bak_ext//[^0-9]/}" 
    f_orig_name="${f_name%.*}" 
    f_only_name="${f_orig_name%.*}" 
    f_only_ext="${f_orig_name##*.}" 
    mv "$f_name" "$f_only_name ($f_bak_num).$f_only_ext" 
done 
cd .. 

與文件夾使用:

#!/bin/bash 

# It will find all the folders according to the arguments in 
# "<YOUR_ARGUMENT_TO_FIND_FOLDERS>" ("find" command) and move them to the 
# "<DEST_FOLDER>" folder. Folders with the same name will have their contents 
# merged, however files with the same name WILL NOT HAVE DUPLICATES (example: 
# "same_name.ext", "same_name (1).ext", "same_name (2).ext", 
# "same_name (3).ext"...). 

cd <YOUR_TARGET_FOLDER> 
find ./ -path "./<DEST_FOLDER>" -prune -o -iname "<YOUR_ARGUMENT_TO_FIND_FOLDERS>" -type d -print0 | xargs -0 -I "{}" sh -c 'rsync -a "{}" "./<DEST_FOLDER>/" && rm -rf "{}"'