2015-12-30 7 views
0

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

/dir1/a/b/c/file1 
/dir1/a/b/c/file2 
/dir1/a/d/file3 
/dir1/a/e/file4 
/dir1/f/dir3/ 
/dir1/f/dir4/ 

... У меня есть список файлов и каталогов, которые могут быть удалены - например file1, file3 и dir3

Я хотел бы переместить (перемещать, а не копировать или деформировать их - файлы большие, и мне нужно сделать это за короткое время) их в другой каталог/dir2 (в одной файловой системе), но - сохранение подкаталогов:

/dir1/a/b/c/file1 -> /dir2/a/b/c/file1 
/dir1/a/d/file3 -> /dir2/a/d/file3 
/dir1/f/dir3/ -> /dir2/f/dir3/ 

Есть ли лучший способ, чем для каждого файла и каталога (для пропусков каталогов последней части) создать каталог в каталоге dir2 (используя mkdir -p/install -d), а затем переместить его?

+0

Где и как у вас есть файлы/каталоги, вы хотите переместить список? – Fazlin

+0

как насчет 'mv/dir1/*/dir2 /'? вам нужно сначала создать dir2. –

+0

Я не хочу переместить все из dir1 - только определенные каталоги/файлы на разных уровнях глубины. – undefine

ответ

0

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

#!/bin/ksh 
c_file="Path_to_the_file_containing_list_for_movement" 
while IFS= read v_line 
do 
    v_fullfilepath=$(find $1 -name "$v_line") 
    v_dirname=$(dirname $v_fullfilepath) 
    v_target_path=${v_dirname/$1\//$2/} 
    mkdir -p "$v_target_path" 
    mv $v_fullfilepath $v_target_path 
    #echo $v_line " " $v_fullfilepath " " $v_dirname " " $v_target_path 
done <"$c_file" 

Это было мое содержимое файла,

file1 
file3 
dir3 
+1

Это не сработает, если в файле/dir1/a и/dir1/b есть файл с тем же именем;) - должно быть использовано -wholename вместо имени, а в файле должны быть абсолютные пути. С другой стороны, будут проблемы со странными именами файлов (например, с $, пробелами и т. Д. Внутри) У меня уже есть что-то похожее на этот скрипт, но ... я ищу более простое и более безошибочное решение. – undefine

0

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

Если вы знакомы с rsync, вы можете использовать его только список файлов, а затем обработать этот список с этой короткой скрипт:

cd dir1 
rsync --files-from list --list-only --no-implied-dirs ./| 
while read mode size date time path 
do 
    dest=$dir2/`dirname $path` # $dir2 must be an absolute path 
    mkdirhier $dest 
    mv $path $dest 
done 
Смежные вопросы