2013-03-20 2 views
4

Я пытаюсь в php перемещать папку, но сохраняю оба файла в папке dest, если существует дубликат. Я попытался сделать это в рекурсии, но слишком сложно, так что многие вещи могут пойти не так, например, с файлами и дублированными файлами \ папками.unix mv --backup = numbered

им пытается работать с командой системы() и я не могу понять, как переместить файлы, но сохранить резервную копию, если дубликат не разрушив расширение

$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 

или любой другой Лик e (1), (2) ... но не разрушая расширение файла. любые идеи? Пожалуйста.

p.s должен использовать команду system().

ответ

0

Если вы хотите сохранить исходные файлы и просто создать копию, используйте cp не mv.

Если вы хотите создать резервную копию архива затем сделать деготь GZIP папки как этот

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

+0

это еще не то, что просили! здесь мне нужно переместить, но не перезаписывать исходный файл, если он существует, сделать копию как -backup! – Mike

+0

Это именно то, что вы просили. Вы не перемещаете файл, который вы создаете, его копию, на которую я отвечаю в первой строке! В примере вы хотите переместить тестовую папку в папку с именем test2, которая оставит вас без тестовой папки. Если вы хотите оставить копию теста там, где она есть, и создать клон этого объекта в test2, то вы хотите использовать cp – Dave

+0

. Я отредактировал старт так понятнее – Mike

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

rsync копии мне нужно переместить. – Mike

+0

Обновлено --remove-source-files – Chris

+0

это не работает !, я попробовал его с файлами и папками, и если файл существует, он просто игнорирует его. не создавая копию исходного файла внутри папки dest и не удаляя исходный файл. – Mike

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

0

Из-за внешнего вида, кажется, нет встроенного метода для резервного копирования файлов при сохранении расширения в правильном месте. Может быть, неправильно, но я не смог найти тот, который не делает то, что уже указывал ваш первоначальный вопрос.

Поскольку вы сказали, что это сложно скопировать файлы по сравнению с использованием PHP, возможно, вы можете сделать это так же, как вы делаете это прямо сейчас, получать файлы в формате

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

Затем с помощью РНР проанализируйте файлы и переименуйте их в желаемый формат. Таким образом, вам не придется иметь дело с разрешениями и дублировать файлы, которые вы упомянули об осложнениях. Вам просто нужно искать файлы с этим форматом и переименовывать их.

+0

Идея была предложена на работе, но она слишком неэффективна для перемещения, а затем регенерирует ее, чтобы исправить ход. – Mike

+0

@ user1725378 Является ли это чем-то, что делается очень часто? Это неэффективно в том смысле, что он не делает все за один шаг, но я не думаю, что это сильно повлияет на производительность. – MysticXG

+0

все его сервер делает (перемещает случайные файлы и папки из местоположения в местоположение). он должен быть одним ударом. – Mike

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 "{}"'