我的任务是将具有特殊名称的多个目录中的所有文件复制到目标目录。
所以我构建这个目录来测试我的命令。测试目录树如下所示:
.
├── dir1
│ └── file1
└── test
我想要 mv dir1 中的所有文件进行测试的命令是:
find . -type d -name "*dir*" -exec mv {}/* test \;
然后我得到:
mv: rename ./dir1/* to test/*: No such file or directory
我想这是因为在那个额外的 -exec 表达式中,该命令没有将 * 视为通配符。
所以我做了:
find . -type d -name "*dir*" -exec mv {}/file1 test \;
成功将 file1 移动到测试。
但重点是,我现在需要所有文件的表达式,以便我可以完成此文件传输工作。
我该如何在find -exec
指挥组中表达这一点?
答案1
mv "$dir_path"/* ...
不仅会移动文件,还会移动"$dir_path"
.至少名称不以点开头的所有文件(隐藏文件)。在 bash 中,您可以使用选项更改此设置dotglob
。但如果*
扩展得很好(匹配所有内容,但对于命令行来说不是太多),那么您可以使用 shell 进行间接寻址:
find . -type d -name "*dir*" -exec bash -c 'mv "$0"/* /path/to/test' {} \;
答案2
尝试:
$ find -type d -name '*dir*' -exec sh -c '
for d do
for f in "$d"/*; do
[ -f "$f" ] && mv -- "$f" /path/to/test
done
done
' sh {} +
答案3
你也可以尝试这个。考虑到test目录与其他目录在同一目录下,
find . -mindepth 2 ! -name test -exec cp {} test \;
这会将所有单个文件复制到目录 test ,转义 dir1 、 dir2 等。请注意,这将省略子目录本身并复制它们的内容。您还可以使用 ls 命令来测试这一点。
find . -mindepth 2 ! -name test -ls