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

时间:2019-03-31 10:58:10

标签: 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/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个参数。

如果能够在移动所有文件后删除空文件夹,那也很好,但这不是必需的。

1 个答案:

答案 0 :(得分:1)

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

mkdir /tmp/assets

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

mv /tmp/assets public/assets