【问题标题】:Moving files from one directory to another preserving subdirectories将文件从一个目录移动到另一个保留子目录
【发布时间】:2016-04-04 11:21:12
【问题描述】:

我有包含内容的目录(示例)

/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)然后将其移动到更好的方法?

【问题讨论】:

  • 在哪里以及如何列出要移动的文件/目录?
  • mv /dir1/* /dir2/ 呢?你需要先创建 dir2。
  • 我不想从 dir1 移动所有内容 - 只移动不同深度级别的特定目录/文件。
  • 最简单的解决方案之一是使用 rsync,在 --include-from 和 --remove-source-files 中包含文件列表。但是 - 它复制文件,然后删除 - 我需要避免复制 - 对于大文件需要太多时间。
  • 重命名目录,然后删除不需要的文件?提供,在你的情况下是可能的。

标签: bash shell directory filesystems


【解决方案1】:

最简单的解决方案之一是使用 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

【讨论】:

    【解决方案2】:

    我已经使用您上面提到的示例尝试了此代码,它运行正常。请在使用之前对其进行测试。在第二行中,您必须将所有文件名放在纯文本文件中并提供其路径。我的文件内容如下所示

    #!/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
    

    【讨论】:

    • 当 /dir1/a 和 /dir1/b 中存在同名文件时将不起作用 ;) - 应该使用 -wholename 而不是 -name,并且在文件中应该绝对路径。另一方面 - 奇怪的文件名会出现问题(例如,内部有 $、空格等)我已经为该脚本提供了一些类似的东西,但是 - 我正在寻找更简单、更防错的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2014-12-04
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多