我有内容目录(示例)
/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)然后将其移动到?
答案 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