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/*
是否可以不创建临时文件夹?是的,它可以工作。但是,我建议使用不同的目录。在分析源代码时更改源代码是一种反模式。这将为你以后省去麻烦