将文件从一个目录移动到另一个目录,保留子目录

时间:2015-12-30 13:14:25

标签: bash shell directory filesystems

我有内容目录(示例)

/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

我想移动(移动,不复制或tar它们 - 文件很大,我需要在短时间内完成)它们到另一个目录/ 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)然后将其移动到?

2 个答案:

答案 0 :(得分: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 :(得分:0)

  

最简单的解决方案之一是使用rsync,其中包含文件列表   --include-from和--remove-source-files。但是 - 它复制文件,然后删除 - 我需要避免复制 - 对于大文件它   花太多时间。

如果您对rsync感到满意,可以使用它来列出文件,然后使用这个简短的shell脚本处理该列表:

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