如何将包含完整路径的文件移动到子文件夹?

How to move files including full path to a subfolder?

我有一个 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\)\(.*\)# public/assets#' | xargs -I% mv %

但它抱怨 mv 命令的语法不正确。我只给它传递了一个参数,但是在 运行 sed 之后它由 2 个路径组成,其中一个 space,所以我希望它把它当作 2 个参数。

如果有一种方法可以在移动所有文件后删除空文件夹,那也很好,但这不是必需的。

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

mkdir /tmp/assets

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

mv /tmp/assets public/assets