我正在尝试将所有文件从一个文件夹移动到另一个文件夹,除了一些特定的文件夹。
我尝试通过以下方式移动除.git
、assets
或build
文件夹之外的所有文件:
find .. ! -regex '\(.git\|assets\|build\)' | xargs mv -t ../build
我期望这个命令能做什么:
- 查找父文件夹中所有非 .git、assets 或 build 的文件/文件夹。
- 将这些文件/文件夹移动到 ../build
文件夹结构如下:
.
├── application
├── assets
├── build
├── download_files
├── images
├── mybb
├── system
└── tools
我的工作目录是工具文件夹。
如果我执行find .. ! -regex '\(.git\|assets\|build\)'
它仍然显示.git
,assets
并构建。
我的命令有什么问题?
答案1
您可能漏掉了一些通配符,请尝试
find .. ! -regex '\(.*\/\.git.*\|.*\/assets.*\|.*\/build.*\)'
我还添加了路径分隔符 (/),以便作为路径一部分出现的资产或构建不匹配。
答案2
您还可以使用 bash 的扩展 glob 来过滤这些目录。首先确保已启用 extglob。
shopt -s extglob
然后
mv ../!(assets|build) ../build
glob 不会匹配以 开头的文件.
,因此无需过滤掉.git
。但是,如果您想移动以 开头的其他文件.
,则还需要启用 dotglob shell 选项。
shopt -s extglob dotglob
mv ../!(.git|assets|build) ../build