【问题标题】:How to move files including full path to a subfolder?如何将包括完整路径的文件移动到子文件夹?
【发布时间】:2019-03-31 19:53:10
【问题描述】:

我有一个 public 文件夹,在其根文件夹和子文件夹中包含 .html 和非 .html 文件。我需要将所有非 .html 文件移动到 public 文件夹的子文件夹中,例如到public/assets,保留他们的完整路径。

到目前为止,我得到了这样的东西:

mkdir -p public/assets
find public -type f -not -name "*.html" -print0 | xargs -0I{} mv {} public/assets/

它不能正常工作,因为它不会移动具有完整路径的文件,例如如果有文件public/foo/bar.js,它将被移动到public/assets/bar.js,而不是public/assets/foo/bar.js

我也尝试了另一个版本:

mkdir -p public/assets
find public -type f -not -name "*.html" | sed 's#\(public\)\(.*\)#\1\2 public/assets\2#' | xargs -I% mv %

但它抱怨mv 命令的语法不正确。我只给它传递了一个参数,但是在运行sed 之后,它由2 个路径组成,用一个空格分隔,所以我希望它会将它视为2 个参数。

如果有办法在移动所有文件后删除空文件夹,那就太好了,但这不是必需的。

【问题讨论】:

    标签: bash find xargs


    【解决方案1】:

    我建议为此使用 rsync。另外,我会使用不同位置的文件夹作为目的地。然后可以将该文件夹复制回您的公用文件夹。

    mkdir /tmp/assets
    
    rsync -r --include="*/" --exclude="*.html" --include="*" --prune-empty-dirs public/* /tmp/assets
    
    mv /tmp/assets public/assets
    

    【讨论】:

    • 谢谢!我必须添加 --remove-source-files 才能移动文件。如果我添加--exclude=public/assets/* 是否可以不创建临时文件夹?
    • 是的,它可以工作。但是,我建议使用不同的目录。在您仍在分析源时更改源是一种反模式。以后会省事的
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多