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

Bash 如何将包含完整路径的文件移动到子文件夹?,bash,find,xargs,Bash,Find,Xargs,我有一个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
文件夹,在其根文件夹和子文件夹中包含
.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
之后,它由两条路径组成,用一个空格分隔,因此我希望它将它视为两个参数


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

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

mkdir /tmp/assets

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

mv /tmp/assets public/assets

谢谢我必须添加
——删除源文件
才能移动文件。如果我添加
--exclude=public/assets/*
是否可以不创建临时文件夹?是的,它可以工作。但是,我建议使用不同的目录。在分析源代码时更改源代码是一种反模式。这将为你以后省去麻烦